python - 根据同一行中的值填充 NaN 单元格

标签 python pandas dataframe data-cleaning

我已经问过类似的问题,但没有得到答复,所以我想我会采取不同的方法,看看是否有人知道如何做到这一点;

首先我会告诉你我的目标和我已经知道的内容:

我当前正在清理数据集,需要向后填充数据集以消除一些 NaN 值。

如下图所示

Data

我想向后填充相同 X 列值的 Na 列,并使用行值为 1 的 Y 值填充 Na 单元格

这张图片显示了我想要的结果

Data

我已经知道我可以使用

 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/

相关文章:

python - pywinauto 使用 Windows 自动化 API 吗?

python - 按周和月聚合 Pandas 数据框

python - 连接字符串列和索引

python-3.x - 使用 pandas 转换文件中的数据时出现 KeyError5

python - 如何使用 Django 1.10 将数据从 html 表单存储到 postgres 数据库?

python - 从 dataproc 中运行的 pyspark 作业将 python 数据对象保存到 Google 存储中的文件

python - 如何正确运行查询 Flask-SQLAlchemy 数据库的连续测试?

python - 从UTM坐标到 Pandas 的经纬度

python - 如何从 DataFrame 中检索单个值

r - 为什么函数 rbind.data.frame 在 do.call 中表现不同