【问题标题】:Groupby year and apply function to another column - Python, Pandas按年份分组并将函数应用于另一列 - Python,Pandas
【发布时间】:2020-03-10 01:34:04
【问题描述】:

我有一个多索引、多列数据框:

  start  A          B             C          D
0 2019  35.156667   51.621111   18.858684    1  
1 2019  NaN         50.211905   18.991290   -1  
2 2019  42.836250   58.778235   18.788889    1  
3 2020  NaN         8.188000    17.805833    1      
4 2020  42.568000   55.907143   17.300000   -1  
5 2021  46.458333   42.293750   26.322500    1  
6 2021  43.675000   60.475000   29.520000    1

每年(“开始”列)我想在 A 列中填充 NaN,如果 D>0,则使用前向值,如果 D

  start  A          B             C          D
0 2019  35.156667   51.621111   18.858684    1  
1 2019  35.156667   50.211905   18.991290   -1  
2 2019  42.836250   58.778235   18.788889    1  
3 2020  42.568000   8.188000    17.805833    1      
4 2020  42.568000   55.907143   17.300000   -1  
5 2021  46.458333   42.293750   26.322500    1  
6 2021  43.675000   60.475000   29.520000    1

我正在尝试:

df[['A','D']] = df.groupby('start').apply(lambda x: x['A'].fillna(method='ffill') if x['D']>0 else x['A'].fillna(method='bfill'))

但我收到如下错误:

The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

有什么帮助吗?谢谢

【问题讨论】:

    标签: python pandas group-by apply


    【解决方案1】:

    GroupBy.agg 用于每组的前向和后向填充,然后通过numpy.where 设置值:

    df1 = df.groupby('start')['A'].agg(['ffill','bfill'])
    print (df1)
           ffill      bfill
    0  35.156667  35.156667
    1  35.156667  42.836250
    2  42.836250  42.836250
    3        NaN  42.568000
    4  42.568000  42.568000
    5  46.458333  46.458333
    6  43.675000  43.675000
    
    print (df1.columns)
    Index(['ffill', 'bfill'], dtype='object')
    
    df['A'] = np.where(df['D'] < 0, df1['ffill'], df1['bfill'])
    print (df)
       start          A          B          C  D
    0   2019  35.156667  51.621111  18.858684  1
    1   2019  35.156667  50.211905  18.991290 -1
    2   2019  42.836250  58.778235  18.788889  1
    3   2020  42.568000   8.188000  17.805833  1
    4   2020  42.568000  55.907143  17.300000 -1
    5   2021  46.458333  42.293750  26.322500  1
    6   2021  43.675000  60.475000  29.520000  1
    

    另外,如果每组只有 2 个值并检查 D 不是必需的(取决于数据):

    df['A'] =  df.groupby('start')['A'].apply(lambda x: x.ffill().bfill())
    print (df)
       start          A          B          C  D
    0   2019  35.156667  51.621111  18.858684  1
    1   2019  35.156667  50.211905  18.991290 -1
    2   2019  42.836250  58.778235  18.788889  1
    3   2020  42.568000   8.188000  17.805833  1
    4   2020  42.568000  55.907143  17.300000 -1
    5   2021  46.458333  42.293750  26.322500  1
    6   2021  43.675000  60.475000  29.520000  1
    

    【讨论】:

    • 感谢您的回答,您确定:df1['ffill'], df1['bfill']?我收到关键错误,因为它将其视为列标签。顺便说一句,数据框要大得多,每年有很多行。
    • @Luca91 - 是的,它在另一个新的数据框 df1 列中。
    • @Luca91 - 答案已编辑,您的工作如何print (df1)
    • 真的!我仍然在苦苦挣扎,因为它是一个多列数据框,其中 A 是上列的子列,通常我通过 df[('UpColumn', 'A')] 调用它,所以现在它变成了 3 级列,做你知道怎么称呼它吗?
    • 它适用于 df[('UpColumn', 'A', 'ffill')] 谢谢!
    猜你喜欢
    • 2020-12-09
    • 2016-02-13
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    相关资源
    最近更新 更多