计算总和-使用groupby

时间:2019-08-27 20:19:30

标签: python python-3.x pandas pandas-groupby

我想对数据框中的特定列进行分组,并计算由此创建的子组的总和,同时保留(显示)每个子组中的所有记录。

我正在尝试创建自己的信用卡支出跟踪程序。 (我知道已经有几种可用,但其目的是学习Python。)

我通常使用“商人”,“日期”,“类型”和“金额”字段

我想执行以下一项操作:

  1. 按商家对商品进行分组,然后在每个此类分组中,将金额划分为“借方”和“贷方”下的(两个新列)。我还希望能够将这些列下的金额相加。对每个商人组重复此操作。

  2. 如果无法根据交易的“类型”(即“借方”和“贷方”)进行拆分,那么我希望能够分别对借方和贷方进行汇总,保留订单项(即在显示时)。在“金额”列上执行sum()只会为每个商人提供一个数字,我验证了这是不正确的金额。

我的数据框如下:

   Posted_Date  Amount    Type       Merchant  
0   04/20/2019  -89.70   Debit            UNI  
1   04/20/2019   -6.29   Debit          BOOKM  
2   04/20/2019  -36.42   Debit       BROOKLYN  
3   04/18/2019  -20.95   Debit  MTA*METROCARD  
4   04/15/2019  -29.90   Debit           ZARA  
5   04/15/2019   -7.70   Debit         STILES 

在读取数据框并将交易标记为借方或借方之后,我拥有的代码是:

merch_new = df_new.groupby(['Merchant','Type'])
merch_new.groups

for key, values in merch_new.groups.items():
    df_new['Amount'].sum()
    print(df_new.loc[values], "\n\n")

我可以按以下方式拆分它:

    Posted_Date  Amount   Type   Merchant  
217  05/23/2019  -41.70  Debit        AT  
305  04/27/2019  -12.40  Debit        AT  



 Posted_Date  Amount    Type Merchant  
127   07/08/2019    69.25   Credit       AT  
162   06/21/2019   139.19   Credit       AT

理想情况下,我想要以下内容: the line items are displayed and a total for a given subgroup. In this case for merchant 'AT' and ideally sorted by date.

    Date    Merchant    Credit  Debit  
305 4/27/2019   AT  0   -12.4  
217 5/23/2019   AT  0   -41.7  
162 6/21/2019   AT  139.19  0  
127 7/8/2019    AT  69.25   0  

                  208.44    -54.1

它看起来很简单,但是我无法以这种方式对其进行格式化。

编辑: 我收到一个rename_axis()错误:    rename_axis() got an unexpected keyword argument 'index' 并且如果我删除index参数,则会出现“ columns”的相同错误

我搜索了很多用法(如Benoit所示),但找不到任何用法。他们都使用字符串或列表。我尝试使用: rename_axis(None,None) 我得到错误: ValueError: No axis named None for object type <class 'pandas.core.frame.DataFrame'>

我不知道这是否是因为我使用的是python版本(3.6.6)。我尝试了Spyder和Jupyter。但是我得到了同样的错误。

我用过: rename_axis(None, axis=1),我似乎获得了预期的结果(有点) 但是我无法理解它的解释方式,因为没有为“ None”所读的参数指定限定符。谁能解释一下?

感谢您的帮助! 非常感谢!

1 个答案:

答案 0 :(得分:0)

我认为您尝试实现以下目标:

In [1]:
## Create example
import pandas as pd
cols = ['Posted_Date', 'Amount', 'Type', 'Merchant']  
data = [['04/20/2019', -89.70, 'Debit', 'UNI'],
        ['04/20/2019', -6.29, 'Credit', 'BOOKM'],
        ['04/20/2019', -36.42, 'Debit', 'BROOKLYN'],
        ['04/20/2019', -6.29, 'Credit', 'BOOKM'],
        ['04/20/2019', -54.52, 'Credit', 'BROOKLYN'],
        ['04/18/2019',  -20.95, 'Credit', 'BROOKLYN']]  
df = pd.DataFrame(columns=cols, data=data)

## Pivot Table with aggregation function ='sum'

df_final = pd.pivot_table(df, values='Amount', index=['Posted_Date', 'Merchant'],
               columns=['Type'], aggfunc='sum').fillna(0).reset_index().rename_axis(index=None, columns=None)

df_final['Total'] = df_final['Debit'] + df_final['Credit']

Out [1]:

    Posted_Date Merchant    Credit  Debit   Total
0   04/18/2019  BROOKLYN    -20.95  0.00    -20.95
1   04/20/2019  BOOKM       -12.58  0.00    -12.58
2   04/20/2019  BROOKLYN    -54.52  -36.42  -90.94
3   04/20/2019  UNI         0.00    -89.70  -89.70

​