【问题标题】:Pandas DataFrame: value in a column based on previous values in another column for same value in a third columnPandas DataFrame:一列中的值基于另一列中的先前值,第三列中的相同值
【发布时间】:2021-12-08 08:02:53
【问题描述】:

我有一个这样的数据框:

df = pd.DataFrame({
    'ref1': [1,1,3,7,7],
    'ref2': [1,2,1,1,2],
    'value': [1,2,3,5,6],
})

df

    ref1    ref2    value
0   1       1       1
1   1       2       2
2   3       1       3
3   7       1       5
4   7       2       6

我想添加列new_value 并获得这个:

    ref1    ref2    value   new_value   my_comment
0   1       1       1       NaN         no prev ref1
1   1       2       2       NaN         no prev ref1
2   3       1       3       1.0 
3   7       1       5       3.0 
4   7       2       6       NaN         no same ref2 @ ref1==3

遵循这些规则:

  1. new_valuevalue 相同的 ref2 和以前的 ref1(在像 [1,3,7] 这样的有序列表中),否则
  2. NaN

【问题讨论】:

  • 为什么最后一个NaN不是1
  • @mozway 因为我想要ref2==2value(相同的ref2),而ref1==3(列表中的前一个ref1)

标签: pandas dataframe conditional-statements


【解决方案1】:

鉴于1, 3, 7 是有序的,您可以旋转、移位、堆栈回以获取移位后的值,然后合并:

df.merge(df.pivot(index='ref1', columns='ref2', values='value')
           .shift().stack().reset_index(name='new_value'),
         on=['ref1','ref2'], how='left'
)

输出:

   ref1  ref2  value  new_value
0     1     1      1        NaN
1     1     2      2        NaN
2     3     1      3        1.0
3     7     1      5        3.0
4     7     2      6        NaN

注意如果ref1, ref2有重复的组合,pivot会失败。在这种情况下,您要枚举对:

df.merge(df.assign(enum=df.groupby(['ref1','ref2']).cumcount())
           .pivot(index=['enum','ref1'], columns='ref2', values='value')
           .shift().stack()
           .reset_index(level='enum', drop=True)
           .reset_index(name='new_value'),
         on=['ref1','ref2'], how='left'
)

【讨论】:

    猜你喜欢
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    相关资源
    最近更新 更多