Pandas 自定义文件格式
我有一个大熊猫数据框,我需要把它写成RankLib可以理解的格式。具有目标、查询ID和3个功能的示例如下:Pandas 自定义文件格式,pandas,bigdata,Pandas,Bigdata,我有一个大熊猫数据框,我需要把它写成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
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米的行,这显然是非常缓慢的。有没有更好的方法使用熊猫本身的I/O?您可以这样做: 数据: 解决方案:
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
helper命令:
In [158]: cols2id
Out[158]: {'f1': '1', 'f2': '2', 'f3': '3'}
您可以只将所需的输出添加为一个新列,然后只写该列输出。这是一个很好的解决方案,但是它不再适合我的内存…您的代码中的
计数器是什么?我剪掉了太多,让我重新添加,这是为了计算需要命名的功能(在我的示例中为1..N)您可以尝试使用df.iloc[i:i+5000]
迭代块,并使用EdChum的方法,希望不会耗尽内存。谢谢,不幸的是,此应用程序也会耗尽内存,我决定将其吸收并逐行写入(它的值为10%)。好的解决方案!
In [158]: cols2id
Out[158]: {'f1': '1', 'f2': '2', 'f3': '3'}