1

我需要根据条件复制并粘贴列的先前非空值。我需要以最有效的方式来做,因为行数是几百万。使用for loop将是计算成本高的。

因此,如果有人可以在这方面帮助我,我们将不胜感激。

|Col_A   |Col_B   |
|--------|--------|
|10.2.6.1| NaN    |
|  NaN   | 51     |
|  NaN   | NaN    |
|10.2.6.1| NaN    |
|  NaN   | 64     |
|  NaN   | NaN    |
|  NaN   | NaN    |
|10.2.6.1| NaN    |

根据条件,只要Col_A在此示例中 10.2.6.1 将具有任何值(非空),最后看到的值Col_B (51...64 respectively)将粘贴到该Col_A值不为空的相应行上。数据集应如下所示:

|Col_A   |Col_B   |
|--------|--------|
|10.2.6.1| NaN    |
|  NaN   | 51     |
|  NaN   | NaN    |
|10.2.6.1| 51     |
|  NaN   | 64     |
|  NaN   | NaN    |
|  NaN   | NaN    |
|10.2.6.1| 64     |

我尝试使用下面的代码,但它不起作用:

df.loc[df["Col_A"].notnull(),'Col_B'] = df.loc[df["Col_B"].notnull(),'Col_B']
4

1 回答 1

1

ffill您可以使用最新的非 NaN 值向前填充NaN 值。

如果您想保留 NaN,Col_B则只需创建一个新列 ( Col_C),如下所示:

df['Col_C'] = df['Col_B'].ffill()

然后替换Col_Bwhere Col_Ahas a value 中的值:

df.loc[df['Col_A'].notnull(), 'Col_B'] = df.loc[df['Col_A'].notnull(), 'Col_C']
df = df.drop(columns=['Col_C'])

结果:

       Col_A    Col_B
0   10.2.6.1      NaN
1        NaN     51.0
2        NaN      NaN
3   10.2.6.1     51.0
4        NaN     64.0
5        NaN      NaN
6        NaN      NaN
7   10.2.6.1     64.0

如果您不需要保留所有 NaN 行,则可以简化上述操作。例如,可以这样做:

df['Col_B'] = df['Col_B'].ffill()
df = df.dropna()

结果:

       Col_A    Col_B
3   10.2.6.1     51.0
7   10.2.6.1     64.0
于 2021-03-08T03:54:19.020 回答