python - 使用 Pandas,我们如何将状态的初始值复制到每一行作为新列
问题描述
被标记为重复的问题不回答该问题。在下面的示例中,我已经成功地将结果按连续值分组。我的问题是如何用每个组的第一个值填充一个新列。请注意 state_start_value 不是连续的,因此链接的答案不适用。
我有一个 2 列的 DataFrame。一个用于值,一个用于状态。我需要在状态开始时添加另一个具有初始值的列,但我不知道该怎么做。
由此:
df
value state
0 1 0
1 2 0
2 3 -1
3 4 -1
4 5 -1
5 6 0
6 7 1
7 8 0
8 9 0
我需要:
value state state_start_value
0 1 0 1
1 2 0 1
2 3 -1 3
3 4 -1 3
4 5 -1 3
5 6 0 6
6 7 1 7
7 8 0 8
8 9 0 8
我尝试添加名为 state_count 的列,因此我可以按此分组并获取每个组的初始状态。结果数字是正确的,它们与当前行不一致。而且必须有更好的方法。
df['state_count'] = (df.state.diff() != 0).cumsum()
df['state_start_value'] = df.groupby('state_count')['value'].first()
产量
df
value state state_count state_start_value
0 1 0 1 NaN
1 2 0 1 1.0
2 3 -1 2 3.0
3 4 -1 2 6.0
4 5 -1 2 7.0
5 6 0 3 8.0
6 7 1 4 NaN
7 8 0 5 NaN
8 9 0 5 NaN
解决方案
df['state_start_value'] = df.groupby((df.state != df.state.shift()).cumsum())['value'].transform('first')
或者解压一下:
change = df.state != df.state.shift()
cumulative_change = change.cumsum()
values_gb = df.groupby(cumulative_change)['value']
df['start_value'] = values_gb.transform('first')
@jezrael从这个答案中借用了“按连续块分组”的技巧。
推荐阅读
- java - 线程“主”java.lang.SecurityException 中的异常:禁止的包名称:java.io
- python - Pandas pd.to_datetime() 删除重复值
- java - 春季启动 @ComponentScan 与 @Import
- vue.js - 如何在 vuex 操作上使用 setTimeout?
- java - RabbitMQ+SpringAMPQ:代理不可用;在启动期间无法强制队列声明:java.net.ConnectException:连接被拒绝:连接
- asp.net-core - Blazor 合格名单
组件之间 - typescript - Typescript 在泛型中推断泛型
- c++ - C ++使用卡在函数调用中的辅助线程取消pthread
- python - 我怎样才能杀死后台python进程?
- kubernetes - 使用 helm 模板助手创建过滤列表