在Pandas DataFrame中按字典分组

3
我从一个Excel文件中读取数据,它长这样:

enter image description here

我想对每个员工的Q1和Q2求和,因此我创建了一个字典,并希望根据此进行分组。
import pandas as pd

mb2 = pd.read_excel('C:\\Users\\IBM_ADMIN\\Desktop\\ml-1m\\工作簿1.xlsx', sheetname='Sheet3')
mapping = {'Jan':'Q1','Feb':'Q1','Mar':'Q1','Apr':'Q2','May':'Q2','Jun':'Q2'}
mb2.groupby(by=mapping,axis=1).sum()

enter image description here

如何显示字段名称?我尝试这样做,但它没有起作用:

mb2.groupby(by=(mapping,'Name'),axis=1).sum()
2个回答

3
你可以先使用set_index,然后使用groupby,最后再使用reset_index:
df = mb2.set_index('Name').groupby(by=mapping,axis=1).sum().reset_index()
print (df)
      Name    Q1    Q2
0     Tony  1367  1835
1    Rafal  1405  2574
2     John  1550  1409
3  Katrina  1555  1509
4    Kathy  1583  1491
5      Tom  1344  1874

只有一个解决方案可以被接受 - 它取决于你选择我的还是其他人的。顺便说一句,按字典分组非常好用;) - jezrael

1

一个快速的解决方案是将结果DataFrame保存在一个新变量中(下面的代码中命名为grouped_data),然后使用原始DataFrameName列分配给它:

grouped_data = mb2.groupby(by=mapping,axis=1).sum()
grouped_data['Name'] = mb2['Name']
print(grouped_data)

编辑: 另一种实现相同结果的方法是修改mapping字典,将"Name": "Name"对添加到其中,并像之前一样调用mb2.groupby(by=mapping,axis=1).sum()


添加一个新列是可行的,但将“Name”:“Name”添加到映射字典中不起作用。 - tonyibm
你正在使用哪个版本的pandas?我在0.19.1版本上尝试了这两种解决方案,都可以工作。 - Blackecho
是这样吗:mapping = {'Name':'姓名','Jan':'第一季度','Feb':'第一季度', 'Mar':'第一季度','Apr':'第二季度','May':'第二季度','Jun':'第二季度'} mb2_new = mb2.groupby(by=mapping,axis=1).sum() - tonyibm
以下代码在pandas 0.19.1中对我有效(使用不同的数字):mapping = {'Jan': 'Q1', 'Feb': 'Q1', 'Mar': 'Q1', 'Apr': 'Q2', 'May': 'Q2', 'Jun': 'Q2', 'Name': 'Name'} ---df = pd.DataFrame([{'Name': 'Tony', 'Jan': 433, 'Feb': 692, 'Mar': 242, 'Apr': 1, 'May': 4, 'Jun': 11}, {'Name': 'Rafal', 'Jan': 263, 'Feb': 659, 'Mar': 483, 'Apr': 10, 'May': 6, 'Jun': 10}]) ---print(df.groupby(by=mapping, axis=1).sum()) --- 如果这对你无效,你可以使用我的其他解决方案或@jezrael的解决方案。 - Blackecho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接