python - 如何将前一组的最后一行的值分配给下一组?
问题描述
目标是将前一个字母组最后一行的数字放在新列“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
解决方案
用于Series.mask
, then和 lastDataFrame.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
推荐阅读
- angular - Http请求头映射为空
- git - 推送后文件未更新
- ethereum - geth sendTransaction 不起作用
- robotframework - 执行 javascript - 机器人框架
- vba - 检查文件是否处于只读状态(如果语句)VBA
- uitableview - 如何滚动到表格视图的底部?
- php - 获取客户端 IP 地址
- python - 初始化应用程序服务器时出错:无法找到 pgAdmin4.py,终止服务器线程
- node.js - 在 Windows 中创建 NodeJS 命令行包
- javascript - 我的 Angular2+ 应用程序中的所有组件/模块现在都出现“没有路由器提供程序”错误