Pandas:按每个单元格的不同值分组,并将拆分列分成多个列

时间:2018-05-06 10:10:25

标签: python pandas

我希望按每个不同的单元格进行分组,并根据其不同的值将“状态”列拆分为多个列。新列的值应为' 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()的误用。

2 个答案:

答案 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列上生成数据透视图的组合。

因此,您可以开始生成指定了indexcolumns的单独数据透视表,然后使用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)