如何在pandas groupby中创建具有重复键的组?

vam*_*tap 7 python pandas

我想要做的是根据最后一列(键)创建组,以便在第一组中我获得例如第1行.对于第二组,我获得第1行和第2列.在第3组中,我得到最后一列两排.

我尝试用pandas groupby方法做到这一点,grouped = df1.groupby('Key')但正如预期的那样它只返回2组.

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3','A4'],
   ...:                     'B': ['B0', 'B1', 'B2', 'B3', 'B4'],
   ...:                     'C': ['C0', 'C1', 'C2', 'C3', 'C4'],
   ...:                     'D': ['D0', 'D1', 'D2', 'D3', 'D4'],
                            'Key': ['K0', 'K1', 'K1', 'K0', 'K0']},
   ...:                     index=[0, 1, 2, 3, 4])


df1
Out[89]: 
    A   B   C   D Key
0  A0  B0  C0  D0  K0
1  A1  B1  C1  D1  K1
2  A2  B2  C2  D2  K1
3  A3  B3  C3  D3  K0
4  A4  B4  C4  D4  K0
Run Code Online (Sandbox Code Playgroud)

use*_*203 3

您可以使用shift然后cumsumgroupby

grouped = df.groupby((df.Key != df.Key.shift()).cumsum())
grouped.groups

{1: Int64Index([0], dtype='int64'),
 2: Int64Index([1, 2], dtype='int64'),
 3: Int64Index([3, 4], dtype='int64')}
Run Code Online (Sandbox Code Playgroud)

为了说明为什么这有效:

(df.Key != df.Key.shift()).cumsum()

0    1
1    2
2    2
3    3
4    3
Name: Key, dtype: int32
Run Code Online (Sandbox Code Playgroud)

每次Key更改时,该列的累积和都会增加一,即使该值之前已经见过。这允许您对这个新系列进行分组,该系列仅对顺序重复的键进行分组。