Суммируйте значения строк данных в пандах в среднее значение и сумму - PullRequest
0 голосов
/ 04 октября 2018

У меня есть датафрейм, как показано ниже:

data =[['A','ABC001','18M01',1,3],['A','ABC002','18M01',2,4],['A','ABC001','18M02',3,3],['B','ABC001','18M01',4,3],['B','ABC002','18M02',5,4],['B','ABC002','18M02',6,4]]
df = pd.DataFrame(data,columns=['Type','Product','Month','Requirement','Inventory'])
df

Ввод:

Type Product Month Requirement Inventory
A    ABC001  18M01     1         3
A    ABC002  18M01     2         4
A    ABC001  18M02     3         3
B    ABC001  18M01     4         3
B    ABC002  18M02     5         4
B    ABC002  18M02     6         4

То, что я пытаюсь сделать, это обобщить его в фрейм данных как-то так

Вывод:

Type    Product           Values         18M01    18M02
A       ABC001      Sum of Requirement     1       3
A       ABC001      Average of Inventory   3       3
A       ABC002      Sum of Requirement     2      NaN
A       ABC002      Average of Inventory   4      NaN
B       ABC001      Sum of Requirement     4      NaN
B       ABC001      Average of Inventory   3      NaN
B       ABC002      Sum of Requirement    NaN      11
B       ABC002      Average of Inventory  NaN      4

Я могу создать это в Pivot Excel очень легко, но совершенно не представляю, когда использовать Pandas Pivot.Пожалуйста, помогите

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

A pivot_table способ ведения дел -

df1 = df.pivot_table('Requirement', ['Type','Product'], 'Month', aggfunc='sum')
df1['Values'] = 'Sum of Requirement'
df2 = df.pivot_table('Inventory', ['Type','Product'], 'Month', aggfunc='mean')
df2['Values'] = 'Average of Inventory'

df1.append(df2)

Выход

Month         18M01  18M02                Values
Type Product
A    ABC001     1.0    3.0    Sum of Requirement
     ABC002     2.0    NaN    Sum of Requirement
B    ABC001     4.0    NaN    Sum of Requirement
     ABC002     NaN   11.0    Sum of Requirement
A    ABC001     3.0    3.0  Average of Inventory
     ABC002     4.0    NaN  Average of Inventory
B    ABC001     3.0    NaN  Average of Inventory
     ABC002     NaN    4.0  Average of Inventory

Вы можете добавить reset_index(), чтобы сделать его лучше -

df1.append(df2).reset_index()

Month Type Product  18M01  18M02                Values
0        A  ABC001    1.0    3.0    Sum of Requirement
1        A  ABC002    2.0    NaN    Sum of Requirement
2        B  ABC001    4.0    NaN    Sum of Requirement
3        B  ABC002    NaN   11.0    Sum of Requirement
4        A  ABC001    3.0    3.0  Average of Inventory
5        A  ABC002    4.0    NaN  Average of Inventory
6        B  ABC001    3.0    NaN  Average of Inventory
7        B  ABC002    NaN    4.0  Average of Inventory
0 голосов
/ 04 октября 2018

Я думаю, вам нужно агрегировать по sum и mean, сгладить MultiIndex в столбце и изменить его на stack с unstack:

df1 = (df.groupby(['Type','Product','Month'])
         .agg({'Requirement': 'sum','Inventory':'mean'})
         .rename(columns={'Requirement':'Sum of Requirement',
                          'Inventory':'Average of Inventory'})
         .stack()
         .unstack(2)
         .reset_index()
         .rename(columns={'level_2':'Values'}))

print (df1)
Month Type Product                Values  18M01  18M02
0        A  ABC001    Sum of Requirement    1.0    3.0
1        A  ABC001  Average of Inventory    3.0    3.0
2        A  ABC002    Sum of Requirement    2.0    NaN
3        A  ABC002  Average of Inventory    4.0    NaN
4        B  ABC001    Sum of Requirement    4.0    NaN
5        B  ABC001  Average of Inventory    3.0    NaN
6        B  ABC002    Sum of Requirement    NaN   11.0
7        B  ABC002  Average of Inventory    NaN    4.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...