2017-08-29 62 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