我有一个包含3列(A,B,C)的数据框。当列C
= 22时,我想用列A
更新列B
。我已经写了这样的更新语句,但是它正在为不匹配的行更新NaN
。你能告诉我如何更新数据框中的数据吗?
df = pd.DataFrame(data=[[10,20,30],[11,21,31],[12,22,32]], columns=['A','B','C'])
df.C = df[df.B==22].A
答案 0 :(得分:3)
执行此操作的几种方法之一,是的,它需要额外的软件包,但是如果您不了解np.where
,则非常方便。
import numpy as np
df['C'] = np.where(df['B']==22, df['A'], df['C'])
答案 1 :(得分:3)
df.loc[df.B==22, 'C'] = df.loc[df.B==22, 'A']
答案 2 :(得分:3)
让我们尝试mask
df.C.mask(df.B==22, df.A,inplace=True)
df
A B C
0 10 20 30
1 11 21 31
2 12 22 12
答案 3 :(得分:2)
另一种替代方法是使用loc
和reindex
:
df['C'] = df.loc[df.B==22,'A'].reindex(df.index).fillna(df['C'])
理想情况下,您可以在这种情况下使用np.where
,但是这就是您的代码无法正常工作的原因:
以下
df[df.B==22].A
返回:
2 12
您将看到返回值的索引为2
,因此,当您设置df.C
(use bracket notation instead of a .
notation)时,它将把名为C
的序列更新为结果中不包含其他索引(仅2个)的,因此其他索引设置为np.nan
强烈建议在分配值时使用chained indexing
,因为这会导致this警告。