具有第一个有效值的熊猫groupby fillna(窗口函数)

时间:2019-02-13 16:20:01

标签: python pandas

我有一个数据集,我需要有条件地填充,并带有来自适当groupby的第一个值,但是我无法弄清楚。

import numpy as np
import pandas as pd
df_dict = {
    'id':[1, 1, 1, 1, 2, 2, 2, 2],
    'data':['A', np.nan, np.nan, np.nan, 'B', np.nan, np.nan, np.nan, 'C', np.nan, np.nan]
}
df = pd.DataFrame(df_dict)

我需要创建一个如下所示的数据框:

final_dict = {
    'id':[1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2],
    'data':['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C']
}
final = pd.DataFrame(final_dict)

我的本​​能是将id分组,然后执行.fillna(something),但我不知道该怎么做。

我尝试过

df.groupby('id')['data'].fillna(df['data'].first_valid_index())

但这会放置0而不是复制我想要的内容。

我还有另一个部分解决方案:

for col_name, data in df.items():
    df[col_name] = df.groupby('id').apply(
        lambda x: x[col_name].fillna(x.loc[x[col_name].last_valid_index(), col_name])
    ).reset_index(drop=True)

2 个答案:

答案 0 :(得分:2)

fillnatransformfirst

df.fillna({'data': df.groupby('id')['data'].transform('first')})

  data  id
0    A   1
1    A   1
2    A   1
3    A   1
4    B   2
5    B   2
6    B   2
7    B   2

  1. transform在每个组中获取内容,然后在组中进行广播
  2. 'first'获取每个组的第一个有效值
  3. fillna带了一个字典,您可以在其中指定要用什么填充的列

答案 1 :(得分:2)

pandas的X<int>具有为我们执行此操作的方法:

X<float>

正是我想要的。