[英]Multi-column replacement in Pandas based on row selection
關於SO如何選擇DataFrame
行並替換這些行中的列中的值,還有很多問題,但是缺少一個用例。 要使用此問題的示例DataFrame
,
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
所以我知道問題是什么,但是解決方案是什么?
您可以嘗試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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.