2015-11-11 2 views
1

У меня есть dataframe, ДФ:Добавить общую строку для каждой подгруппы в панде dataframe

BRAND ART_TYPE YEAR_MONTH metrics Value 
aaa  xyz  201510  a 4500 
aaa  xyz  201510  b 8500 
bbc  abc  201510  c 3500 
bbc  abc  201510  d 10000 
xxx  def  201510  e 15000 

Я хочу, чтобы добавить общую строку для каждой группы ([ «марки» «ART_TYPE», 'YEAR_MONTH «]) Так что результат должен быть:

BRAND ART_TYPE YEAR_MONTH metrics Value 
aaa  xyz   201510  a  4500 
aaa  xyz   201510  b  8500 
aaa  xyz   201510  tot  13000 
bbc  abc   201510  c  3500 
bbc  abc   201510  d  10000 
bbc  abc   201510  tot  13500 
xxx  def   201510  e  15000 
xxx  def   201510  tot  15000 

Как это сделать? У нас есть какая-то функция? Я пробовал с применением функции groupby и не работал. Пожалуйста, дайте мне знать, если для этого требуется дополнительная информация.

Code Я попытался добавляет столбец:

df['total'] = df.groupby(['BRAND','ART_TYPE','YEAR_MONTH']).apply(calctot) 

def calctot(df): 
    return(sum(df['Value'])) 

Это дало ошибку, даже если он работает это будет добавить столбец.

ответ

0

Мне пришлось изменить входные данные в соответствии с рекомендуемым выходом.
Я улучшил функцию calctot - удалите столбцы, а затем добавьте строку строк. Столбец level_3 был создан из старого индекса, я удаляю его. Новые значения в столбце metrics после применения функции groupby были NaN, поэтому я заполняю их значением tot.

# BRAND ART_TYPE YEAR_MONTH metrics Value 
#0 aaa  xyz  201510  a 4500 
#1 aaa  xyz  201510  b 8500 
#2 bbc  abc  201510  c 3500 
#3 bbc  abc  201510  d 10000 
#4 xxx  def  201510  e 15000 


def calctot(df): 
    #delete columns 
    df = df.drop(['BRAND', 'ART_TYPE', 'YEAR_MONTH'], axis=1) 
    #append sum row, ignoring non-numeric column metrics 
    return df.append(df.sum(numeric_only=True), ignore_index=True) 

#groupby and reset index 
df = df.groupby(['BRAND','ART_TYPE','YEAR_MONTH']).apply(calctot).reset_index() 
#delete old index column 
df = df.drop(['level_3'], axis=1) 
#fill NaN to value tot 
df['metrics'] = df['metrics'].fillna('tot') 

print df 
# BRAND ART_TYPE YEAR_MONTH metrics Value 
#0 aaa  xyz  201510  a 4500 
#1 aaa  xyz  201510  b 8500 
#2 aaa  xyz  201510  tot 13000 
#3 bbc  abc  201510  c 3500 
#4 bbc  abc  201510  d 10000 
#5 bbc  abc  201510  tot 13500 
#6 xxx  def  201510  e 15000 
#7 xxx  def  201510  tot 15000 
Смежные вопросы