如何使用 pandas groupby 聚合、组合数据框
Posted
技术标签:
【中文标题】如何使用 pandas groupby 聚合、组合数据框【英文标题】:How to aggregate, combining dataframes, with pandas groupby 【发布时间】:2021-01-22 18:18:15 【问题描述】:我有一个数据框df
和一个列df['table']
,这样df['table']
中的每个项目都是另一个具有相同标题/列数的数据框。我想知道是否有办法像这样处理groupby
:
原始数据框:
name table
Bob Pandas df1
Joe Pandas df2
Bob Pandas df3
Bob Pandas df4
Emily Pandas df5
分组后:
name table
Bob Pandas df containing the appended df1, df3, and df4
Joe Pandas df2
Emily Pandas df5
我发现这段代码 sn-p 可以对数据帧中的字符串执行 groupby
和 lambda,但无法弄清楚如何将整个数据帧附加到 groupby
。
df['table'] = df.groupby(['name'])['table'].transform(lambda x : ' '.join(x))
我也尝试过df['table'] = df.groupby(['name'])['html'].apply(list)
,但这给了我一个df['table']
,而不是所有NaN
。
感谢您的帮助!!
【问题讨论】:
【参考方案1】: 给定 3 个数据帧import pandas as pd
dfa = pd.DataFrame('a': [1, 2, 3])
dfb = pd.DataFrame('a': ['a', 'b', 'c'])
dfc = pd.DataFrame('a': ['pie', 'steak', 'milk'])
给定另一个数据框,列中有数据框
df = pd.DataFrame('name': ['Bob', 'Joe', 'Bob', 'Bob', 'Emily'], 'table': [dfa, dfa, dfb, dfc, dfb])
# print the type for the first value in the table column, to confirm it's a dataframe
print(type(df.loc[0, 'table']))
[out]:
<class 'pandas.core.frame.DataFrame'>
每组数据帧,可以通过使用.groupby
并为每个组聚合一个list
,并将list
中的数据帧与pd.concat
组合成一个数据帧
# if there is only one column, or if there are multiple columns of dataframes to aggregate
dfg = df.groupby('name').agg(lambda x: pd.concat(list(x)).reset_index(drop=True))
# display(dfg.loc['Bob', 'table'])
a
0 1
1 2
2 3
3 a
4 b
5 c
6 pie
7 steak
8 milk
# to specify a single column, or specify multiple columns, from many columns
dfg = df.groupby('name')[['table']].agg(lambda x: pd.concat(list(x)).reset_index(drop=True))
不重复
最初,我将此问题标记为与How to group dataframe rows into list in pandas groupby 重复,认为数据帧可以聚合成list
,然后与pd.concat
结合。
df.groupby('name')['table'].apply(list)
df.groupby('name').agg(list)
df.groupby('name')['table'].agg(list)
df.groupby('name').agg('table': list)
df.groupby('name').agg(lambda x: list(x))
但是,当有dataframes
需要聚合时,这些都会导致StopIteration
错误。
【讨论】:
【参考方案2】:这里让我们创建一个以数据框为列的数据框:
首先,我从三个数据框开始:
import pandas as pd
#creating dataframes that we will assign to Bob and Joe, notice b's and j':
df1 = pd.DataFrame('var1':[12, 34, -4, None], 'letter':['b1', 'b2', 'b3', 'b4'])
df2 = pd.DataFrame('var1':[1, 23, 44, 0], 'letter':['j1', 'j2', 'j3', 'j4'])
df3 = pd.DataFrame('var1':[22, -3, 7, 78], 'letter':['b5', 'b6', 'b7', 'b8'])
#lets make a list of dictionaries:
list_of_dfs = [
'name':'Bob' ,'table':df1,
'name':'Joe' ,'table':df2,
'name':'Bob' ,'table':df3
]
#constuct the main dataframe:
original_df = pd.DataFrame(list_of_dfs)
print(original_df)
original_df.shape #shows (3, 2)
现在我们已经创建了原始数据框作为输入,我们将生成生成的新数据框。为此,我们使用 groupby()、agg() 和 pd.concat()。我们还重置了索引。
new_df = original_df.groupby('name')['table'].agg(lambda series: pd.concat(series.tolist())).reset_index()
print(new_df)
#check that Bob's table is now a concatenated table of df1 and df3:
new_df[new_df['name']=='Bob']['table'][0]
最后一行代码的输出是:
var1 letter
0 12.0 b1
1 34.0 b2
2 -4.0 b3
3 NaN b4
0 22.0 b5
1 -3.0 b6
2 7.0 b7
3 78.0 b8
【讨论】:
您也可以使用此代码行获得最终输出:new_df.set_index('name').loc['Bob','table']
以上是关于如何使用 pandas groupby 聚合、组合数据框的主要内容,如果未能解决你的问题,请参考以下文章
数据分析—Pandas 中的分组聚合Groupby 高阶操作
如何通过另一列的值 pandas 聚合 groupBy [重复]
使用 pandas GroupBy 和时间序列重采样的平均聚合
如何在 pandas groupby 对象上调用不同的聚合操作