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

В настоящее время у меня есть фрейм данных, который несколько структурирован так:

InvoiceNo  Month  Year  Size
     1       1    2014   7
     2       1    2014   8
     3       2    2014   11
     4       3    2015   9
     5       7    2015   8.5

и т. Д. *

Я пытаюсь создать функцию, которая будет сегментировать Dframe по годами сгруппировать по размеру и месяцу, а затем посчитаем InvoiceNo, а затем, наконец, снимаем стэк с этого фрейма данных.

То, что я делал, выглядит примерно так:

x = 2014

def Year_calc(df):
    return df[df['Year'] == x].groupby(['Size','Month']).agg({'InvoiceNo': 'count'}).unstack(0).columns.droplevel(0).fillna(0)

, а затемdf2014 = Year_calc (df)

Но он возвращает этот вывод:

Float64Index([], dtype='float64', name='Size')

Кто-нибудь может указать, что я делаю неправильно?

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

Используйте groupby, count и unstack:

res = df.groupby(['Year', 'Size', 'Month',]).InvoiceNo.count().unstack(0, fill_value=0)
res

Year        2014  2015
Size Month            
7.0  1         1     0
8.0  1         1     0
8.5  7         0     1
9.0  3         0     1
11.0 2         1     0

Или, что эквивалентно pivot_table:

res = df.pivot_table(index=['Size', 'Month'], 
                     columns='Year', 
                     values='InvoiceNo', 
                     aggfunc='count', 
                     fill_value=0)

Year        2014  2015
Size Month            
7.0  1         1     0
8.0  1         1     0
8.5  7         0     1
9.0  3         0     1
11.0 2         1     0

Сравните это следующим образом:

res[2014] > res[2015]

В качестве альтернативы просто рассчитайте это для нужного года:

(df[df.Year.eq(2014)]
     .groupby(['Size', 'Month'])
     .InvoiceNo
     .count()
     .unstack(1, fill_value=0))

Month  1  2
Size       
7.0    1  0
8.0    1  0
11.0   0  1
0 голосов
/ 28 сентября 2018

вот входные данные:

import pandas as pd

d = {'InvoiceNo':[1,2,3,4,5],'Month':[1,1,2,3,7],'Year':[2014,2014,2014,2015,2015],'Size':[7,8,11,9,8.5]}
df = pd.DataFrame(data = d)   

РЕШЕНИЕ 1:

с использованием предыдущих ответов и элементов, которые вы дали, вот функция, которую мне удалось написать:

def Year_calc(data, year):

# grouping the by Size and month
t1 = data.loc[data.Year == year].groupby(['Size','Month'])

#count the number of Invoice for the given year
t2 = t1.InvoiceNo.count().unstack(0, fill_value=0)
return t2

вот возвращаемая таблица для года = 2014:

Size   7.0   8.0   11.0
Month                  
1         1     1     0
2         0     0     1

РЕШЕНИЕ 2 Поскольку вы удалили год в качестве параметра, кажется, лучше сделатьНесколько корректировок: либо вы выбираете строки по годам перед выполнением группировки по, либо вы группируете по году, месяцу, размеру, а затем выбираете строки, соответствующие нужному году.

def Year_calc(data):

    # grouping the by Year, Size and month
    t1 = data.groupby(['Year','Month','Size'])

    #count the number of Invoice for the given year
    t2 = t1.InvoiceNo.count().unstack(2, fill_value=0)
    return t2

нефильтрованный результат будет:

Size    7.0     8.0     8.5     9.0     11.0
Year    Month                   
2014    1   1   1   0   0   0
        2   0   0   0   0   1
2015    3   0   0   0   1   0
        7   0   0   1   0   0

предположим, вам нужны данные за 2015 год, затем введите:

tdf = Year_calc(data = df)
tdf.xs(2015) 
# or
test.loc[(2015,),:]

полученный результат:

Size    7.0     8.0     8.5     9.0     11.0
Month                   
    3    0       0       0       1       0
    7    0       0       1       0       0

Пожалуйста, проверьте эту статью намногоиндексная нарезка: здесь

Надеюсь, это полезно!

0 голосов
/ 28 сентября 2018

df.apply передает строку или столбец как объект Series - в зависимости от указанной оси.Он не передает весь фрейм данных.

Если вы хотите применить функцию ко всему фрейму данных, как насчет df2014 = Year_calc(df)?

Вам также следует рассмотреть возможность передачи года в качестве параметра дляфункция - так что ясно, что делает функция year_calc.

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