2016-03-22 42 views
1

關於如何選擇DataFrame中的行以及替換那些行中的列中的值,但是缺少一個用例,有很多關於SO的問題。要使用示例DataFramefrom this question基於行選擇的Pandas中的多列替換

In [1]: df 
Out[1]: 
    apple banana cherry 
0  0  3 good 
1  1  4 bad 
2  2  5 good 

而這個作品,如果一個人想改變基於另一個單柱:

df.loc[df.cherry == 'bad', 'apple'] = df.banana * 2 

或者這臺在兩列中的值:

df.loc[df.cherry == 'bad', ['apple', 'banana'] = np.nan 

但是這不起作用:

df.loc[df.cherry == 'bad', ['apple', 'banana'] = [df.banana, df.apple] 

,因爲很明顯,右側是3x2的,而左側是1x2的,因此錯誤消息

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

所以我的理解是什麼問題,但如何解決?

回答

2

IIUC你可以試試:

df['a'] = df.apple * 3 
df['b'] = df.banana * 2 
print df 
    apple banana cherry a b 
0  0  3 good 0 6 
1  1  4 bad 3 8 
2  2  5 good 6 10 

df[['a', 'b']] = df.loc[df.cherry == 'bad', ['apple', 'banana']] 
print df 
    apple banana cherry a b 
0  0  3 good NaN NaN 
1  1  4 bad 1.0 4.0 
2  2  5 good NaN NaN 

或使用條件與values

df['a'] = df.apple * 3 
df['b'] = df.banana * 2 

df.loc[df.cherry == 'bad', ['apple', 'banana']] = 
df.loc[df.cherry == 'bad', ['a', 'b']].values 
print df 
    apple banana cherry a b 
0  0  3 good 0 6 
1  3  8 bad 3 8 
2  2  5 good 6 10 

另一個選項與原列:

print df[['apple','banana']].shift() * 2 
    apple banana 
0 NaN  NaN 
1 12.0  6.0 
2 2.0  8.0 

df.loc[df.cherry == 'bad', ['apple', 'banana']] = df[['apple','banana']].shift() * 2 
print df 
    apple banana cherry 
0 6.0  3.0 good 
1 12.0  6.0 bad 
2 2.0  5.0 good 
+0

謝謝!第二種解決方案是我正在尋找的解決方案。所以基本上在我的情況下,它會是'df.loc [df.cherry =='bad',['apple','banana']] = df.loc [df.cherry =='bad',['banana ','蘋果']]。值。有趣的是,即使我顛倒了列名,它也沒有'values'的作用。無論如何,還有一個問題:如果我想要一些特殊的東西(例如'df.banana * 2'),有沒有在'df'中添加新列的方法?也許用'apply'? –

+0

謝謝,這看起來不錯 - 所以基本上我可以像'df.loc [...] = pd.concat([df.banana * 3,df.apple * 2],axis = 1).values' 。顯然,價值是我尋找的魔力,謝謝! –