这个问题在这里已有答案:
这被标记为重复的问题没有回答这个问题。我已经在下面的示例中成功地按连续值对结果进行了分组。我的问题是如何使用每个组的第一个值填充新列。请注意,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的this回答中借来的。