首页 > 解决方案 > Python - 应用函数以填充 Group by 组中的 N/A

问题描述

我有 2 列中缺少值的数据集,我想用上一个日期的前一行中的值填充它。因此,存在Weight并且Height应该根据预定义的最后日期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

因此, NaNofWeightHeight列应根据Weight,Height列参考NaN最后一个可用日期的非值来填充,该日期早于 中的实际值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-byandfillna方法来做到这一点group,但它没有填充任何东西。

df.groupby(['Date','WorkerID'], as_index = False).apply(lambda group: group.ffill())

我也尝试使用: df.groupby(['Date','WorkedID']).ffill().reindex(df.columns, axis=1)

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

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

预期结果应该是:

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    0.75      0.15      1
5    18/03/19    M147-50     cat      4.78      0.8       2
6    25/03/19    K178-56     dog      7.03      0.75      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

我会很感激任何想法。谢谢)

标签: pythonpandas

解决方案


我认为您必须先转换Datedatetime

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

并使用sort_valuesbyDategroupbythen 。['WorkerID', 'Category']ffill

df = df.sort_values('Date').groupby(['WorkerID', 'Category']).ffill().sort_index()

df
    WorkerID Category       Date  Weight  Height  Kind_eat
Ind                                                       
1    E145-46      cat 2017-12-31    2.35    0.60         1
2    M147-50      cat 2018-01-09    4.78    0.80         2
3    K178-56      dog 2018-05-27    7.03    0.75         3
4    T106-20    mouse 2018-09-02    0.75    0.15         1
5    M147-50      cat 2019-03-18    4.78    0.80         2
6    K178-56      dog 2019-03-25    7.03    0.75         3
7    T106-20    mouse 2017-04-01    0.75    0.15         4
8    T156-10      dog 2019-01-04    6.99    0.13         4

推荐阅读