Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何对熊猫中的不同数据帧进行分组和聚合_Python_Pandas - Fatal编程技术网

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