【问题标题】:Get value before each consecutive group在每个连续组之前获取值
【发布时间】:2021-05-10 16:59:24
【问题描述】:

我有下表:

        B      C
0  banana  False
1   apple   True
2  banana   True
3   apple  False
4   apple   True
5  banana   True
6   apple  False
7   apple   True
8   apple   True
9   apple  False

我需要在“C”列中找到所有连续的组,并用“B”列中每个组之前的值填充这些组。我可以通过以下方式实现:

consec_groups = (df['C'] != df['C'].shift()).cumsum()
df['Result'] = df['B'].shift().groupby(consec_groups).transform('first')

        B      C  Result
0  banana  False     NaN
1   apple   True  banana
2  banana   True  banana
3   apple  False  banana
4   apple   True   apple
5  banana   True   apple
6   apple  False  banana
7   apple   True   apple
8   apple   True   apple
9   apple  False   apple

如果我有另一列“A”对所有数据进行分组,我该怎么做。所以我想分别对“A”列中的每个组执行相同的操作。例如:

   A       B      C
0  1  banana  False
1  1   apple   True
2  1  banana   True
3  1   apple  False
4  1   apple   True
5  2  banana   True
6  2   apple  False
7  2   apple   True
8  2   apple   True
9  2   apple  False

想要的结果:

   A       B      C  Result
0  1  banana  False     NaN
1  1   apple   True  banana
2  1  banana   True  banana
3  1   apple  False  banana
4  1   apple   True   apple
5  2  banana   True     NaN
6  2   apple  False  banana
7  2   apple   True   apple
8  2   apple   True   apple
9  2   apple  False   apple

【问题讨论】:

    标签: python pandas numpy pandas-groupby


    【解决方案1】:

    相同的逻辑只是在 B 和 first 之前添加额外的 groupby

    df['new'] = df['B'].groupby(df['A']).shift().groupby([df.A,consec_groups]).transform('first')
    Out[10]: 
    0       NaN
    1    banana
    2    banana
    3    banana
    4     apple
    5       NaN
    6    banana
    7     apple
    8     apple
    9     apple
    Name: B, dtype: object
    

    【讨论】:

    • 我认为如果“A”中的组是混合的(没有像我的示例中那样排序。所以你需要在计算conseq_groups之前进行分组) . 我说的对吗?
    猜你喜欢
    • 2021-03-05
    • 1970-01-01
    • 2013-07-13
    • 2016-01-23
    • 2020-12-06
    • 2017-01-11
    • 2020-09-24
    • 2020-03-09
    • 1970-01-01
    相关资源
    最近更新 更多