如何使用 Pandas groupby 聚合、组合数据帧

Ano*_*ous 7 python lambda dataframe pandas pandas-groupby

我有一个数据框df和一列,df['table']这样每个项目df['table']都是另一个具有相同标题/列数的数据框。我想知道是否有办法做groupby这样的事情:

原始数据框:

name    table
Bob     Pandas df1
Joe     Pandas df2
Bob     Pandas df3
Bob     Pandas df4
Emily   Pandas df5
Run Code Online (Sandbox Code Playgroud)

分组后:

name    table
Bob     Pandas df containing the appended df1, df3, and df4
Joe     Pandas df2
Emily   Pandas df5
Run Code Online (Sandbox Code Playgroud)

我发现这个代码片段可以groupby对数据帧中的字符串执行 a和 lambda,但无法弄清楚如何将整个数据帧附加到groupby.

name    table
Bob     Pandas df1
Joe     Pandas df2
Bob     Pandas df3
Bob     Pandas df4
Emily   Pandas df5
Run Code Online (Sandbox Code Playgroud)

我也试过df['table'] = df.groupby(['name'])['HTML'].apply(list),但给了我df['table']所有的NaN

谢谢你的帮助!!

Tre*_*ney 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']})
Run Code Online (Sandbox Code Playgroud)
  • 给定另一个数据框,其中数据框位于列中
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'>
Run Code Online (Sandbox Code Playgroud)
  • 每组数据帧都可以组合成一个数据帧,方法是使用.groupby和聚合list每组的 ,并将 , 中的数据帧listpd.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))
Run Code Online (Sandbox Code Playgroud)

不是重复的

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))
Run Code Online (Sandbox Code Playgroud)
  • StopIteration然而,当进行聚合时,这些都会导致错误dataframes