2017-08-29 30 views
1

我是python和编程的一般新手。熊猫条件性返回值在另一列中的相应位置

我想弄清楚如何在熊猫不同列中的相应位置上返回一个逗号分隔值并将此输出存储在一个新列中。见下面

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 

所以,我想能够检查按键的存在(A,B或C)在列B中,则如果存在,则返回列A中的值,该值位于该单元格中对应的逗号分隔值中。

到目前为止,我有这样的:

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

这将为每个key_result一个新列,然后给予1如果该键为B中存在或0,如果没有。不知道该从哪里出发,或者这是否正确。任何帮助深表感谢。谢谢!

回答

1

我在lambda中使用np.core.defchararray.split来帮助拆分列的值。我本可以用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 
+0

这真是太棒了,我真的很抱歉,但在简化问题时,我将键减少为单个字母,是否有适应整个短语的方法,例如, key_list = [猫,狗,猪]而不是key_list = [a,b,c]?我会更新以添加原文Q. – 0mm3

+0

无论哪种方式工作。 – piRSquared

+0

非常感谢,花时间! – 0mm3