使用Pandas,我们如何将状态的初始值复制到每一行作为新列[复制]

问题描述 投票:0回答:1

这个问题在这里已有答案:

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

© www.soinside.com 2019 - 2024. All rights reserved.