Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.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
Python 基于列的值在DataFrame中填充NaN_Python_Pandas_Dataframe_Nan - Fatal编程技术网

Python 基于列的值在DataFrame中填充NaN

Python 基于列的值在DataFrame中填充NaN,python,pandas,dataframe,nan,Python,Pandas,Dataframe,Nan,我有类似以下简化示例的数据: Col1 Col2 Col3 a A 10.1 b A NaN d B NaN e B 12.3 f B NaN g C 14.1 h C NaN i C NaN …数千行。我需要根据Col2中的值填充na,使用类似于ffill方法的方法。我想要的结果是:

我有类似以下简化示例的数据:

Col1    Col2    Col3
a       A       10.1
b       A       NaN
d       B       NaN
e       B       12.3    
f       B       NaN
g       C       14.1
h       C       NaN
i       C       NaN
…数千行。我需要根据Col2中的值填充na,使用类似于ffill方法的方法。我想要的结果是:

Col1    Col2    Col3
a       A       10.1
b       A       10.1
d       B       NaN
e       B       12.3    
f       B       12.3
g       C       14.1
h       C       14.1
i       C       14.1

但是,此方法忽略Col2中的值。有什么想法吗?

这就是你想要的吗

import pandas as pd
import numpy as np


df['Col3'] = np.where(df['Col2'] == 'A', df['Col3'].fillna(10.1), df["Col3"])

当然可以相应地替换。

您可以为
Col2
的每个元素获取数据帧的切片,然后连接结果

>>> pd.concat((df.loc[df.Col2 == letter, :].ffill() for letter in df.Col2.unique()))

  Col1 Col2  Col3
0    a    A  10.1
1    b    A  10.1
2    d    B   NaN
3    e    B  12.3
4    f    B  12.3
5    g    C  14.1
6    h    C  14.1
7    i    C  14.1
编辑:看来@EdChum提出的方法是目前为止最快的

%timeit pd.concat((df.loc[df.Col2 == letter, :].ffill() for letter in df.Col2.unique()))
100 loops, best of 3: 3.57 ms per loop

%timeit df.groupby('Col2').transform('fillna',method='ffill')['Col3']
100 loops, best of 3: 4.59 ms per loop

%timeit df.groupby('Col2')['Col3'].transform(lambda x: x.ffill())
1000 loops, best of 3: 746 µs per loop

我找到的一个答案是:

df['col3'] = df.groupby('Col2').transform('fillna',method='ffill')['col3']

有什么想法吗?

如果我理解正确,你可以在“Col2”上分组,然后在“Col3”上调用transform,然后调用
ffill

In [35]:

df['Col3'] = df.groupby('Col2')['Col3'].transform(lambda x: x.ffill())
df
Out[35]:
  Col1 Col2  Col3
0    a    A  10.1
1    b    A  10.1
2    d    B   NaN
3    e    B  12.3
4    f    B  12.3
5    g    C  14.1
6    h    C  14.1
7    i    C  14.1

看来Col1是完全不相关的,对吗?如果不是,请解释原因。我想你指的是
df.groupby('Col2')。transform('fillna',method='ffill')['Col3']
。否则,它似乎有效,但仅适用于连续的组(这是问题或不是问题)。同意,我编辑了解决方案以反映您的评论。谢谢Hi Ed。请注意,第一个B(索引=2)应该是NaN,因为它是“B”的第一个值,不能向前填充。@Alexander这里没有ffill,因为NaN行是dropped@Alexander好吧,我明白你的意思了