使用python的双头数据帧、sumif(可能是groupby?)
下面是我所拥有的和我想要得到的: 基本上,这些都是excel中的SUMIF公式,我想在python中重新创建它,我尝试使用pandas groupby().sum()函数,但我不知道如何在这样的两个标题上进行分组,然后如何对数据排序 原始数据帧:使用python的双头数据帧、sumif(可能是groupby?),python,pandas,dataframe,Python,Pandas,Dataframe,下面是我所拥有的和我想要得到的: 基本上,这些都是excel中的SUMIF公式,我想在python中重新创建它,我尝试使用pandas groupby().sum()函数,但我不知道如何在这样的两个标题上进行分组,然后如何对数据排序 原始数据帧: df = pd.DataFrame( {'Group': {0: 'Name', 1: 20201001, 2: 20201002, 3: 20201003, 4: 20201004, 5: 20201005, 6: 20201006, 7: 2020
df = pd.DataFrame( {'Group': {0: 'Name', 1: 20201001, 2: 20201002, 3: 20201003, 4: 20201004, 5: 20201005, 6: 20201006, 7: 20201007, 8: 20201008, 9: 20201009, 10: 20201010}, 'Credit': {0: 'Credit', 1: 65, 2: 69, 3: 92, 4: 18, 5: 58, 6: 12, 7: 31, 8: 29, 9: 12, 10: 41}, 'Equity': {0: 'Stock', 1: 92, 2: 62, 3: 54, 4: 52, 5: 14, 6: 5, 7: 14, 8: 17, 9: 54, 10: 51}, 'Equity.1': {0: 'Option', 1: 87, 2: 30, 3: 40, 4: 24, 5: 95, 6: 77, 7: 44, 8: 77, 9: 88, 10: 85}, 'Credit.1': {0: 'Credit', 1: 62, 2: 60, 3: 91, 4: 57, 5: 65, 6: 50, 7: 75, 8: 55, 9: 48, 10: 99}, 'Equity.2': {0: 'Option', 1: 61, 2: 91, 3: 38, 4: 3, 5: 71, 6: 51, 7: 74, 8: 41, 9: 59, 10: 31}, 'Bond': {0: 'Bond', 1: 4, 2: 62, 3: 91, 4: 66, 5: 30, 6: 51, 7: 76, 8: 6, 9: 65, 10: 73}, 'Unnamed: 7': {0: 'Stock', 1: 54, 2: 23, 3: 74, 4: 92, 5: 36, 6: 89, 7: 88, 8: 32, 9: 19, 10: 91}, 'Bond.1': {0: 'Bond', 1: 96, 2: 10, 3: 11, 4: 7, 5: 28, 6: 82, 7: 13, 8: 46, 9: 70, 10: 46}, 'Bond.2': {0: 'Bond', 1: 25, 2: 53, 3: 96, 4: 70, 5: 52, 6: 9, 7: 98, 8: 9, 9: 48, 10: 58}, 'Unnamed: 10': {0: float('nan'), 1: 63.0, 2: 80.0, 3: 17.0, 4: 21.0, 5: 30.0, 6: 78.0, 7: 23.0, 8: 31.0, 9: 72.0, 10: 65.0}} )
最后我想要的是:
df = pd.DataFrame( {'Group': {0: 20201001, 1: 20201002, 2: 20201003, 3: 20201004, 4: 20201005, 5: 20201006, 6: 20201007, 7: 20201008, 8: 20201009, 9: 20201010}, 'Credit': {0: 127, 1: 129, 2: 183, 3: 75, 4: 123, 5: 62, 6: 106, 7: 84, 8: 60, 9: 140}, 'Equity': {0: 240, 1: 183, 2: 132, 3: 79, 4: 180, 5: 133, 6: 132, 7: 135, 8: 201, 9: 167}, 'Stock': {0: 146, 1: 85, 2: 128, 3: 144, 4: 50, 5: 94, 6: 102, 7: 49, 8: 73, 9: 142}, 'Option': {0: 148, 1: 121, 2: 78, 3: 27, 4: 166, 5: 128, 6: 118, 7: 118, 8: 147, 9: 116}} )
任何从何处开始的想法,或任何东西都值得赞赏给你。第一行似乎是真正的标题,所以我们首先将其移动到列名,并将索引设置为
Name
df2 = df.rename(columns = df.loc[0]).drop(index = 0).set_index(['Name'])
然后我们按列分组并求和
df2.groupby(df2.columns, axis=1, sort = False).sum().reset_index()
我们得到了
Name Credit Stock Option Bond
0 20201001 127.0 146.0 148.0 125.0
1 20201002 129.0 85.0 121.0 125.0
2 20201003 183.0 128.0 78.0 198.0
3 20201004 75.0 144.0 27.0 143.0
4 20201005 123.0 50.0 166.0 110.0
5 20201006 62.0 94.0 128.0 142.0
6 20201007 106.0 102.0 118.0 187.0
7 20201008 84.0 49.0 118.0 61.0
8 20201009 60.0 73.0 147.0 183.0
9 20201010 140.0 142.0 116.0 177.0
我意识到输出并不完全符合您的要求,但由于我们无法看到您的SUMIF公式,我不知道您要聚合哪些列
编辑
继您的评论之后,我注意到,据我所知,聚合规则有些混乱,因此同一列包含在多个输出列中(如Equity.1
)。我认为自动化在这里没有什么用处,您可以通过直接引用要添加的列来复制您的SUMIF
体验。因此,我认为以下内容可以满足您的需求
df = df.drop(index =0)
df2 = df[['Group']].copy()
df2['Credit'] = df['Credit'] + df['Credit.1']
df2['Equity'] = df['Equity'] + df['Equity.1']+ df['Equity.2']
df2['Stock'] = df['Equity'] + df['Unnamed: 7']
df2['Option'] = df['Equity.1'] + df['Equity.2']
df2
产生
Group Credit Equity Stock Option
-- -------- -------- -------- ------- --------
1 20201001 127 240 146 148
2 20201002 129 183 85 121
3 20201003 183 132 128 78
4 20201004 75 79 144 27
5 20201005 123 180 50 166
6 20201006 62 133 94 128
7 20201007 106 132 102 118
8 20201008 84 135 49 118
9 20201009 60 201 73 147
10 20201010 140 167 142 116
这还使您可以控制在最终输出中包含哪些列
如果您希望这比您需要对列的标签做些什么更自动化,因为您希望为要聚合的一组列创建一个唯一的标签。如果在多个计算中使用同一输入列,可能最容易的方法是使用正确的标签复制它我认为您的数据格式不正确;带有NAN标题的最后一列,它在最后一列中指向何处result@sammywemmyNAN不会去任何地方,也不需要所有东西这就是它从内部工作系统下载的方式对不起,信贷和权益的SUMIF汇总了第一行的信贷和权益,而期权和债券则是2中期权和债券价值的总和。行您的值是正确的,我只是不明白为什么不包括股本,而在代码中没有任何东西会排除它?我怎样才能排除一个类别?就像在真实的数据集中一样,有20-30个,我只需要10个。谢谢!由一列用于多个输出,您是指日期旁边的数字吗?此外,我需要在python中执行此操作,以跟进并创建一些动态表,或者将数据集复制到excel中已经实现了自动化,但文件太大/太慢,某些部分需要更动态,这在python中比excel更容易。祝您好运!我的意思是
Equity.1
列中的数字同时输入Equity
output和Option
output,所以使用groupby
是个棘手的问题——最好明确说明如何计算列,这是我回答的第二部分。哦,我明白了@piterberg哦,非常感谢您的帮助,非常感谢