我已经问过类似的问题,但没有得到答复,所以我想我会采取不同的方法,看看是否有人知道如何做到这一点;
首先我会告诉你我的目标和我已经知道的内容:
我当前正在清理数据集,需要向后填充数据集以消除一些 NaN
值。
如下图所示
我想向后填充相同 X 列值的 Na 列,并使用行值为 1 的 Y 值填充 Na 单元格
这张图片显示了我想要的结果
我已经知道我可以使用
df.loc[df['Y'] == 1] = df.loc[:,].bfill(limit=1)
使其仅填充与 Y 值行 1 匹配的单元格(因此底部 Na 单元格未填充)。
这是我的问题:使用上面的代码,它填充了中间的 Na,因为左侧的 Y 值为 1,这对于顶部单元格来说很好,因为源单元格和 Na 单元格的 X 值为 1,尽管对于中间的 Na,X 值为 2 和 3。那么,有没有办法填充行中共享相同 X 值的单元格? (源和 Na 之间的 X 值必须相同,否则不会发生任何情况。)
谢谢!
最佳答案
我们可以尝试使用 loc
+ groupby bfill
:
df.loc[df['Y'] == 1, 'Z'] = df.groupby('X')['Z'].bfill()
groupby
将确保每组 X
值被独立处理,bfill
将回填每组。 df['Y'] == 1
确保仅更新 Y
值为 1 的行。
df
:
X Y Z
0 1 1 2.0
1 1 2 2.0
2 2 1 NaN
3 3 1 3.0
4 3 2 NaN
5 4 1 4.0
初始帧:
import numpy as np
import pandas as pd
df = pd.DataFrame({'X': [1, 1, 2, 3, 3, 4],
'Y': [1, 2, 1, 1, 2, 1],
'Z': [np.nan, 2, np.nan, 3, np.nan, 4]})
df
:
X Y Z
0 1 1 NaN
1 1 2 2.0
2 2 1 NaN
3 3 1 3.0
4 3 2 NaN
5 4 1 4.0
编辑以填充除 X 和 Y 之外的所有列,使用:
df.loc[df['Y'] == 1, df.columns.difference(['X', 'Y'])] = df.groupby('X').bfill()
关于python - 根据同一行中的值填充 NaN 单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68449417/