2

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

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

我目前正在清理数据集,需要反向填充数据集以删除一些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 有 2 和 3 的 X 值。那么,有没有办法填充行下方共享相同 X 值的单元格?(源和 Na 之间的 X 值必须相同,否则,什么都不会发生。)

谢谢!

4

2 回答 2

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()
于 2021-07-20T04:06:27.947 回答
1

尝试使用shift

df.loc[df['Y'].eq(1) & df['X'].shift(-1).eq(df['X']), 'Z'] = df['Z'].bfill(limit=1)
于 2021-07-20T04:06:59.520 回答