簡體   English   中英

基於行選擇的Pandas中的多列替換

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM