Pandas 自定义文件格式

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

我有一个大熊猫数据框,我需要把它写成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米的行,这显然是非常缓慢的。有没有更好的方法使用熊猫本身的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'}