Skip to main content
 首页 » 编程设计

python之pandas dataframe aggregate之为什么它返回列名

2025年05月04日15sharpest

这是一个简单的数据框:

   Acid  Balance_1  CustID  Balance_2 
0     1   0.082627       1        NaN 
1     2   0.397579       1   0.459942 
2     3   0.201596       2   0.596573 
3     4   0.616448       3   0.705697 
4     5   0.844865       3   0.483279 
5     6        NaN       4   0.360260 

在按 CustID 分组后,我一直在尝试使用聚合函数。

groupby_obj = time_series.groupby(["CustID"]) 
df = groupeby_obj.agg(set) 

返回

                                             Acid  \ 
CustID                                               
1       set([Balance_1, Balance_2, Acid, CustID])    
2       set([Balance_1, Balance_2, Acid, CustID])    
3       set([Balance_1, Balance_2, Acid, CustID])    
4       set([Balance_1, Balance_2, Acid, CustID])    
 
                                        Balance_1  \ 
CustID                                               
1       set([Balance_1, Balance_2, Acid, CustID])    
2       set([Balance_1, Balance_2, Acid, CustID])    
3       set([Balance_1, Balance_2, Acid, CustID])    
4       set([Balance_1, Balance_2, Acid, CustID])    
 
                                        Balance_2   
CustID                                              
1       set([Balance_1, Balance_2, Acid, CustID])   
2       set([Balance_1, Balance_2, Acid, CustID])   
3       set([Balance_1, Balance_2, Acid, CustID])   
4       set([Balance_1, Balance_2, Acid, CustID])   

而不是我想的那样:

        Acid         Balance_1                    Balance_2 
CustID                             
1       set([1,2])   set([0.082627, 0.397579])    set([NaN, 0.459942]) 
    etc for the other CustIDs... 

为什么聚合会用所有列标题的集合填充数据框?

谢谢, 安妮

请您参考如下方法:

这是你的相框

In [29]: df 
Out[29]:  
   Acid  Balance_1  CustID  Balance_2 
0     1   0.082627       1        NaN 
1     2   0.397579       1   0.459942 
2     3   0.201596       2   0.596573 
3     4   0.616448       3   0.705697 
4     5   0.844865       3   0.483279 
5     6        NaN       4   0.360260 

这是您创建的分组

In [24]: df.groupby(['CustID']).groups 
Out[24]: {1: [0, 1], 2: [2], 3: [3, 4], 4: [5]} 

这是一种查看传递给函数的内容(它的框架)的方法

In [25]: df.iloc[[0,1]] 
Out[25]:  
   Acid  Balance_1  CustID  Balance_2 
0     1   0.082627       1        NaN 
1     2   0.397579       1   0.459942 
 
In [26]: df.iloc[[2]] 
Out[26]:  
   Acid  Balance_1  CustID  Balance_2 
2     3   0.201596       2   0.596573 

下面是集合操作在框架上的作用(你会得到列的列表) 这不是一个非常有趣/有用的操作

In [27]: set(df.iloc[[2]]) 
Out[27]: set(['Balance_1', 'Balance_2', 'Acid', 'CustID']) 

agg 的要点是聚合传递的帧说一个 Series。您的操作 应该降低输入维度

In [28]: df.groupby(['CustID']).agg(lambda x: x.sum()) 
Out[28]:  
        Acid  Balance_1  Balance_2 
CustID                             
1          3   0.480206   0.459942 
2          3   0.201596   0.596573 
3          9   1.461313   1.188976 
4          6        NaN   0.360260 

你想完成什么?