将 DataFrame 拆分为仅包含给定常量值的组

Split DataFrame into groups that contain only a given constant value

我有一个要分成多个组的 DataFrame。每组将是一系列行,其中列 difference 等于 1。如果不是,则跳过它并找到 difference 等于 1 的下一行并开始一个新组。

例如这个:

    id  difference
0   001 1
1   001 1
2   001 1
3   001 1
4   001 1
5   001 1
6   001 2
7   001 2
8   001 1
9   001 1
10  001 1
11  001 1
12  001 4
13  001 1
14  001 1
15  001 1
16  001 1
17  001 1
18  001 1
19  001 1

会3个dfs第一:0到5(含5),第二:8到11,第三:13到19

现在我就是这样做的,我是 pandas 的新手。还有其他有效的方法吗?

grouped = g.df((g['difference'] != g['difference'].shift()).cumsum())
for group_id, group in grouped:
    if (group['difference'].iloc[0] < 1.1) & (group['difference'].iloc[0] > 0.9) and len(
            group.index) > 1:
        #do stuff...

考虑到您的拆分 condition,使用 cumsum to create pseudo-groups for groupby. Then use loc 忽略违反 condition 的行并提取字典理解中的组:

condition = df.difference != 1
dfs = {key: data for key, data in df.loc[~condition].groupby(condition.cumsum())}

注意,如果要包含id作为拆分条件,只需将其添加到groupby并相应地解包:

dfs = {key: data for (_, key), data in df.loc[~condition].groupby(['id', condition.cumsum()])}
#                    ^^^^^^^^                                      ^^^^

输出:

{0:
      id  difference
 0   001           1
 1   001           1
 2   001           1
 3   001           1
 4   001           1
 5   001           1,

 2:
      id  difference
 8   001           1
 9   001           1
 10  001           1
 11  001           1,

 3:
      id  difference
 13  001           1
 14  001           1
 15  001           1
 16  001           1
 17  001           1
 18  001           1
 19  001           1}