熊猫自定义文件格式

时间:2016-05-25 14:03:06

标签: pandas bigdata

我有一个巨大的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有更好的方法吗?

1 个答案:

答案 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'}