Python-套用Group by分组填充N / A的Apply函数

时间:2019-04-09 21:49:36

标签: python pandas

我有2列中缺少值的数据集,我想用上一个上一个日期的前几行中的值来填充它。 因此,有WeightHeight应当根据预定义的Category的最后日期并参考WorkerID(在先前填充的行),例如:

数据示例:

Ind  Date       WorkerID  Category   Weight   Height   Kind_eat
1    31/12/17    E145-46     cat      2.35      0.6       1  
2    01/09/18    M147-50     cat      4.78      0.8       2
3    27/05/18    K178-56     dog      7.03      0.75      3
4    09/02/18    T106-20     mouse    NaN       NaN       1
5    18/03/19    M147-50     cat      NaN       NaN       2
6    25/03/19    K178-56     dog      NaN       NaN       3
7    04/01/17    T106-20     mouse    0.75      0.15      4
8    01/04/19    T156-10     dog      6.99      0.13      4

因此,NaNWeight列中的Height应当基于与非Weight相关的HeightNaN列来填充最后一个可用日期的值,该日期早于Date中的实际值。

例如

5    18/03/19    M147-50     cat      NaN       NaN       2

应由Weight中的Heightline2填充:

5    18/03/19    M147-50     cat      4.78      0.8       2

我尝试通过group-by的{​​{1}}和fillna方法来做到这一点,但是它什么也没填。

group

我也尝试使用: df.groupby(['Date','WorkerID'], as_index = False).apply(lambda group: group.ffill())

实际结果是:-没有正确填写NaN

df.groupby(['Date','WorkedID']).ffill().reindex(df.columns, axis=1)

预期结果应该是:

Ind  Date       WorkerID  Category   Weight   Height   Kind_eat
1    31/12/17    E145-46     cat      2.35      0.6       1  
2    01/09/18    M147-50     cat      4.78      0.8       2
3    27/05/18    K178-56     dog      7.03      0.75      3
4    09/02/18    T106-20     mouse    NaN       NaN       1
5    18/03/19    M147-50     cat      NaN       NaN       2
6    25/03/19    K178-56     dog      NaN       NaN       3
7    04/01/17    T106-20     mouse    0.75      0.15      4
8    01/04/19    T156-10     dog      6.99      0.13      4

任何想法,我将不胜感激。谢谢)

1 个答案:

答案 0 :(得分:1)

我认为您必须先将Date转换为datetime

df['Date'] = pd.to_datetime(df['Date'])

然后将sort_values的{​​{1}}和Date然后groupby的{​​{1}}使用。

['WorkerID', 'Category']