Панды: сгруппировать по разным значениям каждой ячейки и разбить столбец на несколько столбцов - PullRequest
0 голосов
/ 06 мая 2018

Я хочу сгруппировать по каждой отдельной ячейке и разбить столбец «Status» на несколько столбцов на основе их различных значений. Значения нового столбца (столбцов) должны иметь сумму «Количество» на основе вхождений.

Мои данные:

        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 голосов
/ 06 мая 2018

Использование 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)
0 голосов
/ 06 мая 2018

Ты почти у цели.

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() в конце, чтобы превратить его в столбец, а не в метки строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...