首页 > 解决方案 > 如何将前一组的最后一行的值分配给下一组?

问题描述

目标是将前一个字母组最后一行的数字放在新列“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

一个 3 n 1.0

2 n 3.0

一个 5 n 2.0

一个 1 n 5.0

B 1 1 南

B 2 1 1.0

B 1 1 2.0

乙 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 南

D 3 3 4.0

D 2 3 3.0

D 5 3 2.0

D 7 3 5.0

标签: pythonpandas

解决方案


用于Series.mask, then和 lastDataFrame.duplicated的最后一个值:digitSeries.shiftffill

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

推荐阅读