Python 如何对熊猫中的不同数据帧进行分组和聚合
Python 如何对熊猫中的不同数据帧进行分组和聚合,python,pandas,Python,Pandas,df1 A B a 1 a 1 a 4 b 1 b 3 df2 A B a 1 a 2 c 3 c 5 df1.groupby(“A”).size() df2.groupby(“A”).size() 我想得到以下sizeaggregation df1 df2 a 3 2 b 2 0 c 0 2 有没有办法做到这一点? 我想知道聚合方法 如果有人有意见,请告诉我。 谢谢 您可以在两个分组的数据帧上使用pd.concat,并传递axis=1(这本质上是外
df1
A B
a 1
a 1
a 4
b 1
b 3
df2
A B
a 1
a 2
c 3
c 5
df1.groupby(“A”).size()
df2.groupby(“A”).size()
我想得到以下size
aggregation
df1 df2
a 3 2
b 2 0
c 0 2
有没有办法做到这一点?
我想知道聚合方法
如果有人有意见,请告诉我。
谢谢
pd.concat
,并传递axis=1
(这本质上是外部
与pd.merge
的连接,但语法更简洁).fillna(0)
进行一些清理,根据需要使用.rename()
重命名列,并使用.astype(int)
使列数据类型为整数:如果你在熊猫公司工作,我会做一个外部连接
data=[[a'、'a'、'a'、'b'、'b']、[1,1,4,1,3]]
df1=pd.DataFrame(data).T
df1.columns=['A','B']
数据=[[a'、'a'、'c'、'c']、[1,2,3,5]]
df2=pd.DataFrame(data).T
df2.columns=['A','B']
temp1=pd.DataFrame(df1.groupby(“A”).size())
temp2=pd.DataFrame(df2.groupby(“A”).size())
df=temp1.merge(temp2,how='outer',left_index=True,right_index=True)
df.fillna(0)
输出
0_x 0_y
A
a 3.0 2.0
b 2.0 0.0
c 0.0 2.0
您可以执行以下操作:
In [883]: df1 = df1.groupby("A").size().reset_index()
In [884]: df2 = df2.groupby("A").size().reset_index()
In [886]: df1.merge(df2, on='A', how='outer').fillna(0).rename(columns={'0_x': 'df1', '0_y':'df2'}).set_index('A')
Out[886]:
df1 df2
A
a 3.0 2.0
b 2.0 0.0
c 0.0 2.0
只是@David答案的一个变体:
frames = {"df1": df1, "df2": df2}
pd.concat(
{key: value.groupby("A").size() for key, value in frames.items()}, axis=1
).fillna(0)
在中,可以对新列名使用参数键
,因为使用系列
,然后替换缺少的值并转换为整数:
df3 = (pd.concat([df1.groupby("A").size(),
df2.groupby("A").size()], axis=1, keys=['df1','df2'])
.fillna(0)
.astype(int))
print (df3)
df1 df2
a 3 2
b 2 0
c 0 2
另一个想法是首先使用concat
,将多索引
转换为列,因此可能使用最后一次使用:
您所需要做的就是合并df1和df2以获得它。也可以执行
df1.groupby(“A”).size().rename(“df1”)
。
In [883]: df1 = df1.groupby("A").size().reset_index()
In [884]: df2 = df2.groupby("A").size().reset_index()
In [886]: df1.merge(df2, on='A', how='outer').fillna(0).rename(columns={'0_x': 'df1', '0_y':'df2'}).set_index('A')
Out[886]:
df1 df2
A
a 3.0 2.0
b 2.0 0.0
c 0.0 2.0
#groupby using agg to rename axis.
g=df1.groupby("A", as_index=False)['B'].agg({'df1':'size'})
h=df2.groupby("A", as_index=False)['B'].agg({'df2':'size'})
#concat the resultant datframe, fffiil, bfill and dro duplicates
(pd.concat([g,h], ignore_index=True).sort_values(by='A').ffill().bfill()).drop_duplicates()
A df1 df2
0 a 3.0 2.0
1 b 2.0 2.0
3 c 2.0 2.0
frames = {"df1": df1, "df2": df2}
pd.concat(
{key: value.groupby("A").size() for key, value in frames.items()}, axis=1
).fillna(0)
df3 = (pd.concat([df1.groupby("A").size(),
df2.groupby("A").size()], axis=1, keys=['df1','df2'])
.fillna(0)
.astype(int))
print (df3)
df1 df2
a 3 2
b 2 0
c 0 2
df3 = (pd.concat([df1, df2], keys=['df1','df2'])
.reset_index()
.pivot_table(index='A', columns='level_0', aggfunc='size', fill_value=0)
.rename_axis(columns=None, index=None)
)
print (df3)
df1 df2
a 3 2
b 2 0
c 0 2