【问题标题】:How to create column based on conditions on other rows - Pandas Dataframe?如何根据其他行的条件创建列 - Pandas Dataframe?
【发布时间】:2021-04-29 00:51:53
【问题描述】:

我有以下问题:

这样一个名为 df1 的数据框:

    Id      PVF PM_year Year
0   A6489   75  25      2018
1   A175    56  54      2018
2   A2856   34  65      2018
3   A6489   35  150     2019
4   A175    45  700     2019
5   A2856   55  120     2019
6   A6489   205 100     2020
7   A2856   35  445     2020

我想创建一个名为 PM_previous_year 的新列,它对于每个组合 (ID+Year) 等于相同 ID 和上一年的 PM_year 的值...

例子:

对于索引为 3 的行,Id 为 'A6489',年份为 2019。所以新列“PM_previous_year”的值应该是 Id 相同的行的值('A6489')和年份等于 2018 (2019-1)。在这个简单的示例中,它对应于索引为 0 的行,而索引为 3 的行上的新列的预期值为 25。

最后,这个简短示例的目标 DataFrame df2 如下所示:

    Id     PVF  PM_year Year    PM_previous_year
0   A6489   75  25      2018    NaN
1   A175    56  54      2018    NaN
2   A2856   34  65      2018    NaN
3   A6489   35  150     2019    25.0
4   A175    45  700     2019    54.0
5   A2856   55  120     2019    65.0
6   A6489   205 100     2020    150.0
7   A2856   35  445     2020    120.0

我还没有找到任何明显的解决方案。也许有一种方法可以重塑 df,但我对此不是很熟悉。 如果有人有任何想法,我将不胜感激。 谢谢

【问题讨论】:

    标签: pandas dataframe reshape data-manipulation


    【解决方案1】:

    如果可能,请简化解决方案并根据 Id 使用转移 PM_year

    df['PM_previous_year'] = df.groupby('Id')['PM_year'].shift()
    print (df)
          Id  PVF  PM_year  Year  PM_previous_year
    0  A6489   75       25  2018               NaN
    1   A175   56       54  2018               NaN
    2  A2856   34       65  2018               NaN
    3  A6489   35      150  2019              25.0
    4   A175   45      700  2019              54.0
    5  A2856   55      120  2019              65.0
    6  A6489  205      100  2020             150.0
    7  A2856   35      445  2020             120.0
    

    或者:

    s = df.pivot('Year','Id','PM_year').shift().unstack().rename('PM_previous_year')
    
    df = df.join(s, on=['Id','Year'])
    print (df)
          Id  PVF  PM_year  Year  PM_previous_year
    0  A6489   75       25  2018               NaN
    1   A175   56       54  2018               NaN
    2  A2856   34       65  2018               NaN
    3  A6489   35      150  2019              25.0
    4   A175   45      700  2019              54.0
    5  A2856   55      120  2019              65.0
    6  A6489  205      100  2020             150.0
    7  A2856   35      445  2020             120.0
    

    【讨论】:

    • 太棒了!!非常感谢您的“实时”回复。效果很好。
    猜你喜欢
    • 2020-04-25
    • 2020-05-30
    • 2019-11-04
    • 2020-09-24
    • 1970-01-01
    • 2021-03-20
    • 2017-08-26
    • 2018-07-09
    • 2020-06-02
    相关资源
    最近更新 更多