Pandas 数据帧聚合
Pandas Dataframe Aggregation
我有以下数据框(我没有在这里包含索引,但显然还有一个索引)
ID_1
ID_2
Count
55
62
1000
62
55
1200
...
...
...
现在我想聚合这两列,因为我不关心 ID 是在 ID_1 列还是 ID_2.
列中
我想得到以下结果:
ID_1
ID_2
Count
55
62
2200
62
55
2200
...
...
...
这意味着我想对数据框中两个 ID 相同的所有行的计数列求和(不关心它们是在 ID_1 列还是 ID_2 列)。
我考虑过对数据框进行分组,但效果不佳。
我很高兴能得到任何帮助!
创建虚拟群组:
make_group = lambda x: tuple(sorted(x))
df['Count'] = df.groupby(df[['ID_1', 'ID_2']].apply(make_group, axis=1))['Count'] \
.transform('sum')
输出:
>>> df
ID_1 ID_2 Count
0 55 62 2200
1 62 55 2200
# virtual groups
>>> df[['ID_1', 'ID_2']].apply(make_group, axis=1)
0 (55, 62)
1 (55, 62)
dtype: object
按行对 ID 列进行排序
df[['ID_1', 'ID_2']] = np.sort(df[['ID_1', 'ID_2']], axis=1)
现在按 ID 列分组
df.groupby(['ID_1', 'ID_2']).transform(sum)
使用 np.sort、groupby 和聚合对行值进行排序。下面的代码
df=df.assign(Count=pd.DataFrame(np.sort(df.values), columns=df.columns).groupby(['ID_1','ID_2']).transform('sum'))
或者用agg('sort')排序然后groupby
df[df.filter(regex='^ID').columns] =df.filter(regex='^ID').agg('sort')
df['Count']=df.groupby(['ID_1','ID_2']).transform('sum')
ID_1 ID_2 Count
0 55 62 2200
1 62 55 2200
我有以下数据框(我没有在这里包含索引,但显然还有一个索引)
ID_1 | ID_2 | Count |
---|---|---|
55 | 62 | 1000 |
62 | 55 | 1200 |
... | ... | ... |
现在我想聚合这两列,因为我不关心 ID 是在 ID_1 列还是 ID_2.
列中我想得到以下结果:
ID_1 | ID_2 | Count |
---|---|---|
55 | 62 | 2200 |
62 | 55 | 2200 |
... | ... | ... |
这意味着我想对数据框中两个 ID 相同的所有行的计数列求和(不关心它们是在 ID_1 列还是 ID_2 列)。
我考虑过对数据框进行分组,但效果不佳。
我很高兴能得到任何帮助!
创建虚拟群组:
make_group = lambda x: tuple(sorted(x))
df['Count'] = df.groupby(df[['ID_1', 'ID_2']].apply(make_group, axis=1))['Count'] \
.transform('sum')
输出:
>>> df
ID_1 ID_2 Count
0 55 62 2200
1 62 55 2200
# virtual groups
>>> df[['ID_1', 'ID_2']].apply(make_group, axis=1)
0 (55, 62)
1 (55, 62)
dtype: object
按行对 ID 列进行排序
df[['ID_1', 'ID_2']] = np.sort(df[['ID_1', 'ID_2']], axis=1)
现在按 ID 列分组
df.groupby(['ID_1', 'ID_2']).transform(sum)
使用 np.sort、groupby 和聚合对行值进行排序。下面的代码
df=df.assign(Count=pd.DataFrame(np.sort(df.values), columns=df.columns).groupby(['ID_1','ID_2']).transform('sum'))
或者用agg('sort')排序然后groupby
df[df.filter(regex='^ID').columns] =df.filter(regex='^ID').agg('sort')
df['Count']=df.groupby(['ID_1','ID_2']).transform('sum')
ID_1 ID_2 Count
0 55 62 2200
1 62 55 2200