将列索引的字符串附加到DataFrame列

时间:2018-04-25 04:57:31

标签: python pandas dataframe

我正在使用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。如何根据列号附加字符串?

任何帮助都将不胜感激。

3 个答案:

答案 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)