首页 > 解决方案 > 使用 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

标签: pythonpandaspandas-groupby

解决方案


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从这个答案中借用了“按连续块分组”的技巧。


推荐阅读