Pandas根据另一列添加新列

时间:2014-11-10 11:16:27

标签: python pandas dataframe

我有一个列表值列表,如下所示:

res = [["a", "b", "b"], ["d", "e"], ["f", "g"]]

我有一个数据框,如下所示:

df__ = pd.DataFrame({'memberid': ['a1','a2','a3'],
                   'labels':[0,1,2]})

它看起来如下所示:

              labels memberid
        0       0       a1
        1       1       a2
        2       2       a3

我想根据prob列添加另一个名为labels的列,该列由res列表组成。输出将与您运行以下内容时的结果相同:

df__ = pd.DataFrame({'memberid': ['a1','a2','a3'],
                   'labels':[0,1,2],


       labels memberid   prob
0       0       a1       a b b
1       1       a2       d e
2       2       a3       f g

基本上,我使用labels值作为res列表的索引,并填充prob列。

我已经运行了以下代码:

for i in range(len(df__["labels"])):
           k =  df__.iloc[i]["labels"]
           df__["prob"] = " ".join(res[k])

但是我没有从上面的代码中得到我想要的输出。我究竟做错了什么?

1 个答案:

答案 0 :(得分:3)

重新判断你的错误,就在于:

df__["prob"] = " ".join(res[k])

您继续重新分配df__["prob"] = 1值,这是最新的" ".join(res[l]) 因此,最后整列只是最后一个值。 要更正此问题,您可以更改为:

prob = []
for i in range(len(df__["labels"])):
    k =  df__.iloc[i]["labels"]
    prob.append(" ".join(res[k]))
df__['prob'] = prob

此外,您可以使用maplambda来实现相同的结果,这比您的尝试更有效:

import pandas as pd

df__ = pd.DataFrame({'memberid': ['a1','a2','a3'],
                   'labels':[0,1,2]})
res = [["a", "b", "b"], ["d", "e"], ["f", "g"]]
# you can map the values from '__labels' and feed to 'prob' with lambda
df__['prob'] = map(lambda x: ' '.join(res[x]), df__['labels'])

df__
   labels memberid   prob
0       0       a1  a b b
1       1       a2    d e
2       2       a3    f g