Python将两列按不同方向分组

2024-05-16 19:56:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧,我将它按两列分组('Call', 'month')以生成(编辑的敏感信息):

enter image description here

我使用的代码(在从SQL数据库获取相关行之后)是:

a01=[]

for row in rows:
    a01.append({'GrantRefNumber':row[0],'Call': row [1],'FirstReceivedDate':row[2],'TotalGrantValue':row[3]})

df = pd.DataFrame(a01)
new_df01 = df[['Call','FirstReceivedDate','TotalGrantValue']]
new_df01['month'] = pd.Categorical(new_df01['FirstReceivedDate'].dt.strftime('%b'), 
                                 categories=vals, ordered=True) 


groupA01 = new_df01.groupby(['month','Call']).agg({'TotalGrantValue':sum, 'FirstReceivedDate':'count'}).rename(columns={'FirstReceivedDate':'Count'})
groupA01['TotalGrantValue'] = groupA01['TotalGrantValue'].map('{:,.2f}'.format)
groupA01

我要做的是让“Call”是行,月份穿过顶部,每个“Count”和“TotalGrantValue”对应一个月。比如:

enter image description here

有人能帮忙吗?你知道吗


Tags: 数据信息编辑dfnewcountcallrow
2条回答

您需要^{}进行重塑,然后^{}MultiIndex列中,最后按^{}排序:

df = gA.unstack(0).swaplevel(0,1,1).sort_index(1)

样品:

#sample data
rng = pd.date_range('2017-04-03', periods=20, freq='20d')
aDF = pd.DataFrame({'FirstReceivedDate': rng, 'TotalGrantValue': range(20),
                    'Call':list('aaaaabbbbbcccccddddd')})  
#print (aDF)

rgbDF = aDF[['FirstReceivedDate','TotalGrantValue', 'Call']].copy()

vals = ['Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec', 'Jan', 'Feb', 'Mar']
rgbDF['month'] = pd.Categorical(rgbDF['FirstReceivedDate'].dt.strftime('%b'), 
                                 categories=vals, ordered=True) 

gA = rgbDF.groupby(['month','Call']) \
          .agg({'TotalGrantValue':'sum', 'FirstReceivedDate':'count'}) \
          .rename(columns={'FirstReceivedDate':'Count'})
gA['TotalGrantValue'] = gA['TotalGrantValue'].map('{:,.2f}'.format)

print (gA)
           TotalGrantValue  Count
month Call                       
Apr   a               1.00      2
      d              19.00      1
May   a               2.00      1
Jun   a               7.00      2
Jul   b               5.00      1
Aug   b              13.00      2
Sep   b              17.00      2
Oct   c              10.00      1
Nov   c              23.00      2
Dec   c              13.00      1
Jan   c              14.00      1
      d              15.00      1
Feb   d              16.00      1
Mar   d              35.00      2

df = gA.unstack(0).swaplevel(0,1,1).sort_index(1)
print (df)
month   Apr                   May                   Jun                   Jul  \
      Count TotalGrantValue Count TotalGrantValue Count TotalGrantValue Count   
Call                                                                            
a       2.0            1.00   1.0            2.00   2.0            7.00   NaN   
b       NaN            None   NaN            None   NaN            None   1.0   
c       NaN            None   NaN            None   NaN            None   NaN   
d       1.0           19.00   NaN            None   NaN            None   NaN   

month                   Aug                       ...         Nov  \
      TotalGrantValue Count TotalGrantValue       ...       Count   
Call                                              ...               
a                None   NaN            None       ...         NaN   
b                5.00   2.0           13.00       ...         NaN   
c                None   NaN            None       ...         2.0   
d                None   NaN            None       ...         NaN   

month                   Dec                   Jan                   Feb  \
      TotalGrantValue Count TotalGrantValue Count TotalGrantValue Count   
Call                                                                      
a                None   NaN            None   NaN            None   NaN   
b                None   NaN            None   NaN            None   NaN   
c               23.00   1.0           13.00   1.0           14.00   NaN   
d                None   NaN            None   1.0           15.00   1.0   

month                   Mar                  
      TotalGrantValue Count TotalGrantValue  
Call                                         
a                None   NaN            None  
b                None   NaN            None  
c                None   NaN            None  
d               16.00   2.0           35.00  

[4 rows x 24 columns]

您可以使用pd.pivot_table()功能直接从new_df01尝试

    data_p = pd.pivot_table(new_df01, values=['TotalGrantValue'], index=['Call'], columns=['month'], aggfunc=('count', 'mean'))

相关问题 更多 >