我想对数据框中的特定列进行分组,并计算由此创建的子组的总和,同时保留(显示)每个子组中的所有记录。
我正在尝试创建自己的信用卡支出跟踪程序。 (我知道已经有几种可用,但其目的是学习Python。)
我通常使用“商人”,“日期”,“类型”和“金额”字段
我想执行以下一项操作:
按商家对商品进行分组,然后在每个此类分组中,将金额划分为“借方”和“贷方”下的(两个新列)。我还希望能够将这些列下的金额相加。对每个商人组重复此操作。
如果无法根据交易的“类型”(即“借方”和“贷方”)进行拆分,那么我希望能够分别对借方和贷方进行汇总,保留订单项(即在显示时)。在“金额”列上执行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”所读的参数指定限定符。谁能解释一下?
感谢您的帮助! 非常感谢!
答案 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