2016-05-25 4 views
1

У меня огромный Pandas DataFrame, который мне нужно записать в формат, который может понять RankLib. Пример с мишенью, запрос ID и 3 особенности это:Пользовательский формат файла Pandas

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?

+2

Вы можете просто добавить желаемый результат в новый столбец, а затем записать только этот столбец из – EdChum

+0

Это является хорошим решением, однако, что не будет вписываться в моей памяти больше ... –

+0

что 'counter' в ваш код? – MaxU

ответ

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'} 
+0

Благодарим вас, к сожалению, это тоже закончилось из памяти, я решил просто сосать его и написать его по строке (он на 10%). Хорошее решение, хотя! –

Смежные вопросы