我正在使用Learning to Rank来开展一个项目。以下是示例数据集格式(取自https://www.microsoft.com/en-us/research/project/letor-learning-rank-information-retrieval/)。第一列是排名,第二列是查询ID,以下是[feature number]:[feature value]
1008 qid:10 1:0.004356 2:0.080000 3:0.036364 4:0.000000 … 46:0.00000
1007 qid:10 1:0.004901 2:0.000000 3:0.036364 4:0.333333 … 46:0.000000
1006 qid:10 1:0.019058 2:0.240000 3:0.072727 4:0.500000 … 46:0.000000
目前,我已成功将我的数据转换为Pandas.DataFrame
中的以下格式。
10 qid:354714443278337 3500 1 122.0 156.0 13.0 1698.0 1840.0 92.28260 ...
...
前两列已经很好了。我接下来需要的是在剩余列中附加功能编号(例如3500
的第一个功能变为1:3500
)
我知道我可以使用以下命令将字符串附加到列。
df['col'] = 'str' + df['col'].astype(str)
查看第一个功能3500
位于列索引2处,因此我能想到的是为每列附加column index - 1
。如何根据列号附加字符串?
任何帮助都将不胜感激。
答案 0 :(得分:1)
我认为需要DataFrame.radd
从右侧添加列名称,iloc
从第二列到结尾选择
print (df)
0 1 2 3 4 5 6 7 8 \
0 10 qid:354714443278337 3500 1 122.0 156.0 13.0 1698.0 1840.0
1 10 qid:354714443278337 3500 1 122.0 156.0 13.0 1698.0 1840.0
9
0 92.2826
1 92.2826
df.iloc[:, 2:] = df.iloc[:, 2:].astype(str).radd(':').radd((df.columns[2:] - 1).astype(str))
print (df)
0 1 2 3 4 5 6 7 \
0 10 qid:354714443278337 1:3500 2:1 3:122.0 4:156.0 5:13.0 6:1698.0
1 10 qid:354714443278337 1:3500 2:1 3:122.0 4:156.0 5:13.0 6:1698.0
8 9
0 7:1840.0 8:92.2826
1 7:1840.0 8:92.2826
答案 1 :(得分:0)
您可以简单地连接列
df['new_col'] = df[df.columns[3]].astype(str) + ':' + df[df.columns[2]].astype(str)
这将在你的df中输出一个名为new_col
的新列。现在您可以删除不必要的列。
答案 2 :(得分:0)
您可以将字符串转换为字典,然后再将其作为pandas dataframe读取。
import pandas as pd
import ast
df = pd.DataFrame({'rank': [1008, 1007, 1006], 'column':['qid:10 1:0.004356 2:0.080000 3:0.036364 4:0.000000',\
'qid:10 1:0.004901 2:0.000000 3:0.036364 4:0.333333',\
'qid:10 1:0.019058 2:0.240000 3:0.072727 4:0.500000']} )
def putquotes(x):
x1 = x.split(":")
return "'" + x1[0] +"':" + x1[1]
def putcommas(x):
x1 = x.split()
return "{" + ",".join([putquotes(t) for t in x1]) + "}"
import ast
df1 = [ast.literal_eval(putcommas(x)) for x in df['column'].tolist()]
df = pd.concat([df,pd.DataFrame(df1)], axis=1)