使用python的双头数据帧、sumif(可能是groupby?)

使用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

下面是我所拥有的和我想要得到的:

基本上,这些都是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: 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哦,非常感谢您的帮助,非常感谢