简化python / pandas代码

时间:2018-01-18 10:16:15

标签: python pandas series

我的数据如下:

1516268134      49.95   99.982  49.95   0       0       0       0       0       0       0
1516268134      49.95   99.966  49.95   0       0       0       0       0       0       0
1516268134      49.95   100.28  49.95   0       0       0       0       0       0       0
1516268134      49.95   100.01  49.95   0       0       0       0       0       0       0
1516268134      49.95   100.10  49.95   0       0       0       0       0       0       0
1516268134      49.95   99.773  49.95   0       0       0       0       0       0       0
1516268134      49.95   99.246  49.95   0       0       0       0       0       0       0
1516268134      49.95   144.89  49.95   0       0       0       0       0       0       0
1516268135      49.95   55.700  49.95   0       0       0       0       0       0       0
1516268135      49.95   99.441  49.95   0       0       0       0       0       0       0

第2,第3和第4列是浮点数,其余是整数。 分隔符是标签。

我需要取N行,并计算最小值/平均值/最大值,如

1516268134      49.950  55.700  49.950  0       0       0       0       0       0       0
1516268134      49.950  99.939  49.950  0       0       0       0       0       0       0
1516268135      49.9500 144.890 49.950  0       0       0       0       0       0       0

同样,第2,第3和第4列是浮点数,其余列需要是整数。分隔符仍然是一个标签。

代码如下所示:

import sys
import pandas

file=open(sys.argv[2], "w")

for data in pandas.read_table(sys.argv[1], delim_whitespace=True, header=None, chunksize=int(sys.argv[3])):
  file.write("%d\t%f\t%f\t%f\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n" % (data[0].min(),  data[1].min(),  data[2].min(),  data[3].min(),  data[4].min(),  data[5].min(),  data[6].min(),  data[7].min(),  data[8].min(),  data[9].min(),  data[10].min()))
  file.write("%d\t%f\t%f\t%f\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n" % (data[0].mean(), data[1].mean(), data[2].mean(), data[3].mean(), data[4].mean(), data[5].mean(), data[6].mean(), data[7].mean(), data[8].mean(), data[9].mean(), data[10].mean()))
  file.write("%d\t%f\t%f\t%f\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n" % (data[0].max(),  data[1].max(),  data[2].max(),  data[3].max(),  data[4].max(),  data[5].max(),  data[6].max(),  data[7].max(),  data[8].max(),  data[9].max(),  data[10].max()))

file.close()

我想让代码更短,看起来更好(并且更容易理解和维护)。

尝试用单个data.FUNC()替换11x数据[X] .FUNC(),但这给了我错误“TypeError:%d format:需要一个数字,而不是系列”。

我接下来尝试的是data.FUNC()。convert_objects(convert_numeric = True),但这给了我同样的错误。

如何替换

data[0].max(),  data[1].max(),  data[2].max(),  data[3].max(),  data[4].max(),  data[5].max(),  data[6].max(),  data[7].max(),  data[8].max(),  data[9].max(),  data[10].max()

简短而简单,并在数据中保留float / int格式?

我一直在寻找将data.FUNC()转换为11个单独数字的解决方案,但失败了。

-Paavo

2 个答案:

答案 0 :(得分:1)

read_table中的第一个默认分隔符为tab,因此应省略:

然后在list中使用aggregateapply汇总函数:

df = pd.read_table('filename', header=None)

df = df.agg(['min','mean','max'])
#Alternatively:
#df = df.apply(['min','mean','max'])

print (df)
                0      1         2      3    4    5    6    7    8    9    10
min   1.516268e+09  49.95   55.7000  49.95  0.0  0.0  0.0  0.0  0.0  0.0  0.0
mean  1.516268e+09  49.95   99.9388  49.95  0.0  0.0  0.0  0.0  0.0  0.0  0.0
max   1.516268e+09  49.95  144.8900  49.95  0.0  0.0  0.0  0.0  0.0  0.0  0.0

如果需要将数据附加到最终文件,请使用mode='a'使用DataFrame.to_csv

df.to_csv('filename1',index=False, header=None, mode='a', sep='\t')

所有在一起:

file=open(sys.argv[2], "w")

for data in pd.read_table(sys.argv[1], header=None, chunksize=int(sys.argv[3])):
    data = data.agg(['min','max','mean'])
    data.to_csv('filename1',index=False, header=None, mode='a', sep='\t')

答案 1 :(得分:0)

好的,学到了更多的python,关键是要意识到字符串%需要一个元组,然后我能够在保持格式和格式的同时缩短代码。功能。

我最终得到了以下代码;对我来说看起来不错,但我是一个真正的初学者,有任何改进的想法吗?

import sys
import pandas

# parameters
# 1: input file, 11 fields separated with tab; 2nd, 3rd and 4th fields are floats
# 2: output file, reduced data in the same format; all other field are integers
# 3: data reduction slice size, N lines reduced to 3 lines with min/mean/max values

file=open(sys.argv[2],"w")
format="%d\t%f\t%f\t%f\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n"

for data in pandas.read_table(sys.argv[1], header=None, chunksize=int(sys.argv[3])):
  file.write(format % tuple(data.min()))
  file.write(format % tuple(data.mean()))
  file.write(format % tuple(data.max()))

file.close()

不确定这是什么表现,我有点怀疑一次写一行很慢,但明天需要用更大的数据集进行一些测试。