Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Pandas/Python中,基于条件以最有效的方式复制列的最后一次看到的非空值_Python_Python 3.x_Pandas_Dataframe - Fatal编程技术网

在Pandas/Python中,基于条件以最有效的方式复制列的最后一次看到的非空值

在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 | |

我需要根据条件复制并粘贴列的previos非空值。我需要以最有效的方式来做,因为行的数量是几百万。使用for循环将在计算上非常昂贵

因此,如果有人能在这方面帮助我,我将不胜感激

|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
作为答案中的简化方法外,我想不出任何好的方法。删除的附加列的使用应该相对较快,并且不会有太多开销。