假设我有一个数据框,其中每 5 行都填充 NA,如下所示:
我想将第 5 行中找到的 NA 值替换为第 3 行中的值。
到目前为止我已经尝试过:
df.loc[df['Number'] % 5 == 0, ['A','B','C']] = df.loc[df['Number'] % 3 == 0, ['A','B','C']]
这种方法不会引发任何错误,但它什么也不做。但是,如果我用常量替换赋值的右侧,它就可以正常工作,如下所示:
df.loc[df['Number'] % 5 == 0, ['A','B','C']] = 3
知道如何让它发挥作用吗?
编辑:
我不想给出完整的原始任务,但是这个虚拟示例有点错误。因此,我们假设右侧的行数与左侧的行数相同。主要目标仍然是根据条件用数据帧的子集替换每 5 行的值。我希望它能更容易理解一点,对于错误,我们深表歉意。
最佳答案
您的索引未对齐,这就是它不起作用的原因:
# Left hand side
>>> df.loc[df['Number'] % 5 == 0, ['A','B','C']]
A B C
1 NA NA NaN
3 3 5 2.0
# Right hand side
>>> df.loc[df['Number'] % 3 == 0, ['A','B','C']]
A B C
2 5 6 7.0
Pandas 无法在 (1, 3) 和 2 之间对齐索引。解决方案是将右侧转换为 numpy 数组 .values
或.to_numpy()
。但是,如果您这样做,您也会更改第四行。
更新:
So let's assume that the right side has as many rows as the left side
在这种情况下,使用:
df.loc[df['Number'] % 5 == 0, ['A','B','C']] = \
df.loc[df['Number'] % 3 == 0, ['A','B','C']].values
# Before (I slightly modified your example)
>>> df
Number A B C
0 3 2.0 1.0 0.0
1 5 NaN NaN NaN
2 6 5.0 6.0 7.0
3 100 NaN NaN NaN
# After
>>> df
Number A B C
0 3 2.0 1.0 0.0
1 5 2.0 1.0 0.0
2 6 5.0 6.0 7.0
3 100 5.0 6.0 7.0
关于python - 在 Pandas 中,如何用数据帧的另一个子集替换数据帧的一个子集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76177107/