【问题标题】:Filling NaN cells based on a value in the same row根据同一行中的值填充 NaN 单元格
【发布时间】:2021-09-27 15:27:15
【问题描述】:

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

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

我目前正在清理数据集,需要反向填充数据集以删除一些 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 值需要相同,否则,什么都不会发生。)

谢谢!

【问题讨论】:

    标签: python pandas dataframe data-cleaning


    【解决方案1】:

    我们可以试试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()
    

    【讨论】:

    • 你太棒了!非常感谢,我整天都被困在这上面!还有一件事,而不是说 ,'Z' 和 ['Z'] 有没有办法告诉它填充除 X 和 Y 之外的每个单元格?我有很多像 Z 这样的单元格需要填充,超过 80 个,所以我不想为每一列手动更改它。
    • 查看 bfill 除 X 和 Y 之外的所有列的编辑。
    • Henry Ecker @TriggerHappy 问题是这是针对等效值,而不是连续等效值...
    • @Henry Ecker 好的,我明白了,这在我的数据集中不会有问题,因为我所有相同的 X 值都彼此相邻,在我的 df 和所有 x 中它达到了 5000相等的值实际上是相邻的
    • 而且由于我的 bfill 有 1 个参数的限制,所以不会有问题
    【解决方案2】:

    尝试使用shift

    df.loc[df['Y'].eq(1) & df['X'].shift(-1).eq(df['X']), 'Z'] = df['Z'].bfill(limit=1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-13
      • 2014-06-19
      • 1970-01-01
      • 2021-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多