我有一个巨大的Pandas DataFrame,我需要写一个RankLib可以理解的格式。目标,查询ID和3个功能的示例如下:
5 qid:4 1:12 2:0.6 3:13
1 qid:4 1:8 2:0.4 3:11
我编写了自己的函数,迭代行并将它们写成这样:
data_file = open(filename, 'w')
for index, row in data.iterrows():
line = str(row['score'])
line += ' qid:'+str(row['srch_id'])
counter = 0
for feature in feature_columns:
counter += 1
line += ' '+str(counter)+':'+str(row[feature])
data_file.write(line+'\n')
data_file.close()
由于我有大约200个功能和5米行,这显然非常慢。使用Pandas本身的I / O有更好的方法吗?
答案 0 :(得分:1)
你可以这样做:
数据:
In [155]: df
Out[155]:
f1 f2 f3 score srch_id
0 12 0.6 13 5 4
1 8 0.4 11 1 4
2 11 0.7 14 2 10
In [156]: df.dtypes
Out[156]:
f1 int64
f2 float64
f3 int64
score object
srch_id int64
dtype: object
解决方案:
feature_columns = ['f1','f2','f3']
cols2id = {col:str(i+1) for i,col in enumerate(feature_columns)}
def f(x):
if x.name in feature_columns:
return cols2id[x.name] + ':' + x.astype(str)
elif x.name == 'srch_id':
return 'quid:' + x.astype(str)
else:
return x
(df.apply(lambda x: f(x))[['score','srch_id'] + feature_columns]
.to_csv('d:/temp/out.csv', sep=' ', index=False, header=None)
)
out.csv:
5 quid:4 1:12 2:0.6 3:13
1 quid:4 1:8 2:0.4 3:11
2 quid:10 1:11 2:0.7 3:14
cols2id
帮助词:
In [158]: cols2id
Out[158]: {'f1': '1', 'f2': '2', 'f3': '3'}