2016-09-27 34 views
4

考慮df插入列表分爲滿足列條件細胞

A B C 
0 3 2 1 
1 4 2 3 
2 1 4 1 
3 2 2 3 

我想補充另一列"D"使得d包含基於"A""B""C"

A B C D 
0 3 2 1 [1,0] 
1 4 2 3 [1,0] 
2 1 4 1 [0,2] 
3 2 2 3 [2,0] 

條件不同的名單我代碼片段如下所示:

df['D'] = 0 
df['D'] = df['D'].astype(object) 

df.loc[(df['A'] > 1) & (df['B'] > 1), "D"] = [1,0] 
df.loc[(df['A'] == 1) , "D"] = [0,2] 
df.loc[(df['A'] == 2) & (df['C'] != 0) , "D"] = [2,0] 

當我嘗試運行此代碼,它拋出以下錯誤:如建議here但仍與錯誤

ValueError: Must have equal len keys and value when setting with an iterable 

我已經轉換列到Object類型。

我可以推斷出,熊貓正試圖遍歷列表中的元素,並將這些值中的每一個賦值給單元格,因爲我試圖將整個列表分配給符合標準的所有單元格。

有沒有辦法以上述方式分配列表?

回答

3

另一種解決方案是產生lengthdf的創建Series通過listshape填充:

df.loc[(df['A'] > 1) & (df['B'] > 1), "D"] = pd.Series([[1,0]]*df.shape[0]) 
df.loc[(df['A'] == 1) , "D"] = pd.Series([[0,2]]*df.shape[0]) 
df.loc[(df['A'] == 2) & (df['C'] != 0) , "D"] = pd.Series([[2,0]]*df.shape[0]) 
print (df) 
    A B C  D 
0 3 2 1 [1, 0] 
1 4 2 3 [1, 0] 
2 1 4 1 [0, 2] 
3 2 2 3 [2, 0] 
3

這裏是一個愚蠢的辦法做到這一點

cond1 = df.A.gt(1) & df.B.gt(1) 
cond2 = df.A.eq(1) 
cond3 = df.A.eq(2) & df.C.ne(0) 

df['D'] = cond3.map({True: [2, 0]}) \ 
    .combine_first(cond2.map({True: [0, 2]})) \ 
    .combine_first(cond1.map({True: [1, 0]})) \ 

df 

enter image description here

1

免責聲明:這是我自己的問題。

這兩個答案都由jezraelpiRSquared提供。

我只是想增加另一種方式來做到這一點,儘管與我在問題中發佈的要求略有不同。您可以將list轉換爲string,而不是嘗試插入list,然後通過類型轉換來訪問它。

df.loc[(df['A'] > 1) & (df['B'] > 1), "D"] = '[1,0]' 
df.loc[(df['A'] == 1) , "D"] = '[0,2]' 
df.loc[(df['A'] == 2) & (df['C'] != 0) , "D"] = '[2,0]' 

這可能並不適用於每個人的使用,但我肯定能想到的地方,這將足夠的情況。