我希望按每个不同的单元格进行分组,并根据其不同的值将“状态”列拆分为多个列。新列的值应为' Count'根据事件发生。
我的数据:
Department Age Salary Status Count
0 Sales 31-35 46K-50K Senior 30
1 Sales 26-30 26K-30K Junior 40
2 Sales 31-35 31K-35K Junior 40
3 IT 21-25 46K-50K Junior 20
4 IT 31-35 66K-70K Senior 5
5 IT 26-30 46K-50K Junior 3
6 IT 41-45 66K-70K Senior 3
7 Marketing 36-40 46K-50K Senior 10
8 Marketing 31-35 41K-45K Junior 4
9 Administration 46-50 36K-40K Senior 4
10 Administration 26-30 26K-30K Junior 6
我希望它是:
Attribute Junior Senior
0 Administration 6 4
1 IT 23 8
2 Marketing 4 10
3 Sales 80 30
4 21-25 20 0
5 26-30 49 0
6 31-35 44 35
7 36-40 0 10
8 41-45 0 3
9 46-50 0 4
10 26K-30K 46 0
11 31K-35K 40 0
12 36K-40K 0 4
13 41K-45K 4 0
14 46K-50K 23 40
15 66K-70K 0 8
代码:
import pandas as pd
df = pd.DataFrame({'Department': ['Sales', 'Sales', 'Sales',
'IT', 'IT', 'IT', 'IT',
'Marketing', 'Marketing',
'Administration', 'Administration'],
'Age': ['31-35', '26-30', '31-35', '21-25', '31-35',
'26-30', '41-45', '36-40', '31-35', '46-50',
'26-30'],
'Salary': ['46K-50K', '26K-30K', '31K-35K', '46K-50K',
'66K-70K', '46K-50K', '66K-70K', '46K-50K',
'41K-45K', '36K-40K', '26K-30K'],
'Status': ['Senior', 'Junior', 'Junior', 'Junior',
'Senior', 'Junior', 'Senior', 'Senior',
'Junior', 'Senior', 'Junior'],
'Count': [30, 40, 40, 20, 5, 3, 3, 10, 4, 4, 6]},
columns=['Department', 'Age', 'Salary', 'Status',
'Count'])
df2 = df.groupby(['Department']).Count.sum()
.append(df.groupby(['Age']).Count.sum())
.append(df.groupby(['Salary']).Count.sum())
这给了我:
Administration 10
IT 31
Marketing 14
Sales 110
21-25 20
26-30 49
31-35 79
36-40 10
41-45 3
46-50 4
26K-30K 46
31K-35K 40
36K-40K 4
41K-45K 4
46K-50K 63
66K-70K 8
我无法弄清楚如何对状态'进行拆分。我也认为这里有append()
的误用。
答案 0 :(得分:1)
你快到了。
cols = ['Department', 'Age', 'Salary']
parts = [df.groupby([col, 'Status']).Count.sum() for col in cols]
df2 = pd.concat(parts).unstack(fill_value=0)
我使用pd.concat()
而不是重复append()
,因为正如您所指出的那样,append()
不是很好(它很慢)。
分割状态很简单:只需将其添加到groupby()
,然后将unstack()
添加到最后,将其转换为列而不是行标签。
答案 1 :(得分:1)
使用pd.pivot_table()
-
<强>单行强>
df_pivot = pd.pivot_table(df, columns=['Status'], index=['Department'], aggfunc=np.sum).fillna(0).append(pd.pivot_table(df, columns=['Status'], index=['Salary'],aggfunc=np.sum).fillna(0))
<强>输出强>
Count
Status Junior Senior
Administration 6.0 4.0
IT 23.0 8.0
Marketing 4.0 10.0
Sales 80.0 30.0
26K-30K 46.0 0.0
31K-35K 40.0 0.0
36K-40K 0.0 4.0
41K-45K 4.0 0.0
46K-50K 23.0 40.0
66K-70K 0.0 8.0
<强>解释强>
Pandas数据透视表是一个方便的功能,可输出像excel这样的数据透视表。因此,您的输出是在Department
列和Salary
列上生成数据透视图的组合。
因此,您可以开始生成指定了index
和columns
的单独数据透视表,然后使用append
将它们连接起来。
df1=pd.pivot_table(df, columns=['Status'], index=['Department'], aggfunc=np.sum).fillna(0)
然后是Salary
部分 -
df2=pd.pivot_table(df, columns=['Status'], index=['Salary'],aggfunc=np.sum).fillna(0)
最后 -
df3 = df1.append(df2)