将 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}
我有一个要分成多个组的 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}