Pandas conditionaly在另一列的相应位置返回值

时间:2017-08-29 19:35:06

标签: python pandas

我是python和编程的新手。

我试图弄清楚如何在pandas中不同列中的相应位置返回逗号分隔值,并将此输出存储在新列中。请参阅下面的示例

key_list = [cat, dog, pig]

A           B
---------------------
1           cat
1, 2        dog, cat
1, 2, 3     pig, dog, cat

我想要一个输出如下:

A           B          cat_result      dog_result     pig_result 
----------------------------------------------------------------
1           cat            1              NAN           NAN
6, 2        dog, cat       2              6             NAN
8, 3, 1     pig, dog, cat  1              3              8

所以,我希望能够检查B列中是否存在键(a,b或c),然后如果它存在,则返回A列中相应逗号分隔值的值在那个细胞内。

到目前为止,我有这个:

for key in key_list:
    df["{}_result".format{key}] = df.apply(lambda _: int(key in _.B), axis=1)

这将为每个key_result创建一个新列,如果密钥存在于B中则给出1,否则为0。不知道从哪里开始或者这是正确的方法。任何帮助深表感谢。谢谢!

1 个答案:

答案 0 :(得分:1)

我在np.core.defchararray.split中使用lambda来帮助拆分列的值。我可以使用pd.Series.str.split,但我选择了这个。

然后我使用lambda并逐行迭代以创建字典列表。然后可以将该词典列表传递给pd.DataFrame构造函数。

最后,我使用join附加原始数据框。

s = lambda x: np.core.defchararray.split(x.values.astype(str), ', ')
df.join(
    pd.DataFrame(
        [dict(zip(*t)) for t in zip(s(df.B), s(df.A))]
    ).add_suffix('_result')
)

         A              B cat_result dog_result pig_result
0        1            cat          1        NaN        NaN
1     6, 2       dog, cat          2          6        NaN
2  8, 3, 1  pig, dog, cat          1          3          8