我的数据如下:
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
答案 0 :(得分:1)
read_table
中的第一个默认分隔符为tab
,因此应省略:
然后在list
中使用aggregate
或apply
汇总函数:
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()
不确定这是什么表现,我有点怀疑一次写一行很慢,但明天需要用更大的数据集进行一些测试。