根据列的值在DataFrame中填充NaN

时间:2015-07-15 19:58:01

标签: 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中的值填充,使用类似于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中的值。有什么想法吗?

4 个答案:

答案 0 :(得分:2)

如果我理解正确,那么您可以在'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

答案 1 :(得分:1)

我找到的答案如下:

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

有什么想法吗?

答案 2 :(得分:0)

这是你要找的吗?

import pandas as pd
import numpy as np


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

当然要相应更换。

答案 3 :(得分:0)

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

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