【问题标题】:How to assign a value from the last row of a preceding group to the next group?如何将前一组的最后一行的值分配给下一组?
【发布时间】:2021-10-22 21:26:07
【问题描述】:

目标是将前一个字母组最后一行的数字放入新列“last_digit_prev_group”中。我在“col_ok”列中手动输入了预期的正确值作为结果公式。我停止尝试 shift(),但效果与我预期的相差甚远。也许还有其他方法? 请原谅我的帖子前后不一致,我不是 IT 专家,也不懂英语。提前感谢您的支持。

df = pd.read_csv('C:/Users/.../a.csv',names=['group_letter', 'digit', 'col_ok'] , index_col=0,)

df['last_digit_prev_group'] = df.groupby('group_letter')['digit'].shift(1)

打印(df)

group_letter digit col_ok last_digit_prev_group

A 1 n NaN

A 3 n 1.0

A 2 n 3.0

A 5 n 2.0

A 1 n 5.0

B 1 1 NaN

B 2 1 1.0

B 1 1 2.0

B 1 1 1.0

B 3 1 1.0

C 5 3 NaN

C 6 3 5.0

C 1 3 6.0

C 2 3 1.0

C 3 3 2.0

D 4 3 NaN

D 3 3 4.0

D 2 3 3.0

D 5 3 2.0

D 7 3 5.0

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    使用Series.maskDataFrame.duplicated 作为digit 的最后一个值,然后使用Series.shift 和最后一个ffill

    df['last_digit_prev_group'] = (df['digit'].mask(df.duplicated('group_letter', keep='last'))
                                              .shift()
                                              .ffill())
    
    print (df)
    
       group_letter  digit col_ok  last_digit_prev_group
    0             A      1      n                    NaN
    1             A      3      n                    NaN
    2             A      2      n                    NaN
    3             A      5      n                    NaN
    4             A      1      n                    NaN
    5             B      1      1                    1.0
    6             B      2      1                    1.0
    7             B      1      1                    1.0
    8             B      1      1                    1.0
    9             B      3      1                    1.0
    10            C      5      3                    3.0
    11            C      6      3                    3.0
    12            C      1      3                    3.0
    13            C      2      3                    3.0
    14            C      3      3                    3.0
    15            D      4      3                    3.0
    16            D      3      3                    3.0
    17            D      2      3                    3.0
    18            D      5      3                    3.0
    19            D      7      3                    3.0
    

    如果可能,最后一个值是NaN

    df['last_digit_prev_group'] = (df['digit'].mask(df.duplicated('group_letter', keep='last'))
                                              .shift()
                                              .groupby(df['group_letter']).ffill()
    
    print (df)
       group_letter  digit col_ok  last_digit_prev_group
    0             A    1.0      n                    NaN
    1             A    3.0      n                    NaN
    2             A    2.0      n                    NaN
    3             A    5.0      n                    NaN
    4             A    1.0      n                    NaN
    5             B    1.0      1                    1.0
    6             B    2.0      1                    1.0
    7             B    1.0      1                    1.0
    8             B    1.0      1                    1.0
    9             B    3.0      1                    1.0
    10            C    5.0      3                    3.0
    11            C    6.0      3                    3.0
    12            C    1.0      3                    3.0
    13            C    2.0      3                    3.0
    14            C    NaN      3                    3.0
    15            D    4.0      3                    NaN
    16            D    3.0      3                    NaN
    17            D    2.0      3                    NaN
    18            D    5.0      3                    NaN
    19            D    7.0      3                    NaN
    

    【讨论】:

    • 如何在新列“last_digit_MAX_prev_group”中输入前一组字母中最大值的数字。不知道怎么修改代码 df ['last_digit_prev_group'] = (df ['digit'].mask (df.duplicated('group_letter', keep = 'last')).shift().ffill() ) 得到期望值?应该修改代码的哪一部分以及如何修改?我试图更改掩码 (df.duplicated ('group_letter', keep = 'last')) 区域 keep = 'last' 但没有可用选项 ("keep = first", False) 产生预期的结果。你能帮忙吗?
    • 我添加了一行代码,达到了预期的效果:df = df.assign(max1 = df.groupby('group_letter')['digit'].transform('max'))和 df ['last_digit_prev_group'] = (df ['digit'].mask (df.duplicated('group_letter', keep = 'last')).shift().ffill()) 好吧,除非有简单的东西?
    猜你喜欢
    • 2022-10-25
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    相关资源
    最近更新 更多