在Pandas/Python中,基于条件以最有效的方式复制列的最后一次看到的非空值
我需要根据条件复制并粘贴列的previos非空值。我需要以最有效的方式来做,因为行的数量是几百万。使用for循环将在计算上非常昂贵 因此,如果有人能在这方面帮助我,我将不胜感激在Pandas/Python中,基于条件以最有效的方式复制列的最后一次看到的非空值,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,我需要根据条件复制并粘贴列的previos非空值。我需要以最有效的方式来做,因为行的数量是几百万。使用for循环将在计算上非常昂贵 因此,如果有人能在这方面帮助我,我将不胜感激 |Col_A |Col_B | |--------|--------| |10.2.6.1| NaN | | NaN | 51 | | NaN | NaN | |10.2.6.1| NaN | | NaN | 64 | | NaN | NaN | |
|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,61)将粘贴到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']
可以使用最新的非NaN值正向填充NaN值 如果要将NAN保留在
列B
中,只需创建一个新列(列C
),如下所示:
df['Col_C'] = df['Col_B'].ffill()
然后替换列B
中的值,其中列A
有一个值:
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
Col_A Col_B
3 10.2.6.1 51.0
7 10.2.6.1 64.0
如果不需要保留所有NaN行,则可以简化上述操作。例如,可以执行以下操作:
df['Col_B'] = df['Col_B'].ffill()
df = df.dropna()
结果:
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
Col_A Col_B
3 10.2.6.1 51.0
7 10.2.6.1 64.0
谢谢!是的,它工作正常,而且速度非常快。顺便问一下,如果不将我的内容复制到另一个虚拟列(Col_B)中并在以后将其删除,还有其他选择吗?@DarkStar:除了直接在
Col_B
上执行ffill
作为答案中的简化方法外,我想不出任何好的方法。删除的附加列的使用应该相对较快,并且不会有太多开销。