熊猫groupby填充填充需要中间groupby吗?

时间:2018-07-31 02:55:04

标签: python pandas dataframe pandas-groupby

我正在尝试通过分组到一列上,然后泛洪填充组内列的子集(bfill()。ffill())来弥补数据框中丢失的数据。

我以前使用

def ffbf(x):
   return x.ffill().bfill()

df[some_cols] = df.groupby(group_key)[some_cols].transform(ffbf)

但是即使在相对较小的数据帧上,转换也变得令人难以置信(仅3000x20就已经几秒钟了),所以我想看看是否可以对组直接应用填充和填充马上要被囊化。

我是否正确地认为我需要在ffill和bfill之间再次调用groupby,因为这两种方法都不保留分组?

现在我有

df[some_cols] = df[some_cols].groupby(group_key).ffill().groupby(group_key).bfill()

并且我认为,它正在执行我想要的操作,并且比使用transform更快,但是我对熊猫的经验不足以肯定,所以我想问一下。 / p>

[edit]似乎此更改使我的数据混乱。为什么?

1 个答案:

答案 0 :(得分:0)

我认为这里有必要将另外一个groupby和另外一个bfillNaN一起使用,以避免仅将NaN个群组中的In [205]: %timeit df1[some_cols] = df1.groupby(group_key)[some_cols].transform(ffbf) 443 ms ± 7.26 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) In [206]: %timeit df[[group_key] + some_cols] = df[[group_key] + some_cols].groupby(group_key).ffill().groupby(group_key).bfill() 5.69 ms ± 31.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) 个替换为另一个。

为了提高性能,使用以下代码:

np.random.seed(785)

N = 10000
df = pd.DataFrame({'key':np.random.randint(1000, size=N),
                   'A':np.random.choice([1,2,np.nan], size=N),
                   'B':np.random.choice([1,4,np.nan], size=N),
                   'C':np.random.choice([7,0,np.nan], size=N),
                   'D':np.random.choice([7,0,8], size=N)})

df = df.sort_values('key')
print (df)

def ffbf(x):
   return x.ffill().bfill()

group_key = 'key'
some_cols = ['A','B','C']
df1 = df.copy()
df1[some_cols] = df1.groupby(group_key)[some_cols].transform(ffbf)

#a bit chamgef solution for working in pandas 0.23.1
df[[group_key] + some_cols] = df[[group_key] + some_cols].groupby(group_key).ffill().groupby(group_key).bfill()

print (df.equals(df1))
True

invalid