вот входные данные:
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
Пожалуйста, проверьте эту статью намногоиндексная нарезка: здесь
Надеюсь, это полезно!