Я использую функцию агрегации, которую я использовал в своей работе уже давно. Идея состоит в том, что если серия, переданная функции, имеет длину 1 (т.е. Группа имеет только одно наблюдение), то эти наблюдения возвращаются. Если длина проходящей серии больше единицы, то наблюдения возвращаются в списке.
Это может показаться странным для некоторых, но это не проблема X, Y, у меня есть все основания для желания сделать это, что не имеет отношения к этому вопросу.
Это функция, которую я использовал:
def MakeList(x):
""" This function is used to aggregate data that needs to be kept distinc within multi day
observations for later use and transformation. It makes a list of the data and if the list is of length 1
then there is only one line/day observation in that group so the single element of the list is returned.
If the list is longer than one then there are multiple line/day observations and the list itself is
returned."""
L = x.tolist()
if len(L) > 1:
return L
else:
return L[0]
Теперь по какой-то причине, с текущим набором данных, над которым я работаю, я получаю ValueError, заявляя, что функция не уменьшает. Вот некоторые тестовые данные и оставшиеся шаги, которые я использую:
import pandas as pd
DF = pd.DataFrame({'date': ['2013-04-02',
'2013-04-02',
'2013-04-02',
'2013-04-02',
'2013-04-02',
'2013-04-02',
'2013-04-02',
'2013-04-02',
'2013-04-02',
'2013-04-02'],
'line_code': ['401101',
'401101',
'401102',
'401103',
'401104',
'401105',
'401105',
'401106',
'401106',
'401107'],
's.m.v.': [ 7.760,
25.564,
25.564,
9.550,
4.870,
7.760,
25.564,
5.282,
25.564,
5.282]})
DFGrouped = DF.groupby(['date', 'line_code'], as_index = False)
DF_Agg = DFGrouped.agg({'s.m.v.' : MakeList})
При попытке отладить это, я поставил оператор печати в действие print L
и print x.index
и
выход был следующим:
[7.7599999999999998, 25.564]
Int64Index([0, 1], dtype='int64')
[7.7599999999999998, 25.564]
Int64Index([0, 1], dtype='int64')
По какой-то причине кажется, что agg
передает серию дважды функции. Это, насколько я знаю, не является нормальным вообще и, по-видимому, является причиной, по которой моя функция не уменьшается.
Например, если я пишу такую функцию:
def test_func(x):
print x.index
return x.iloc[0]
Это выполняется без проблем, а операторы печати:
DF_Agg = DFGrouped.agg({'s.m.v.' : test_func})
Int64Index([0, 1], dtype='int64')
Int64Index([2], dtype='int64')
Int64Index([3], dtype='int64')
Int64Index([4], dtype='int64')
Int64Index([5, 6], dtype='int64')
Int64Index([7, 8], dtype='int64')
Int64Index([9], dtype='int64')
Это означает, что каждая группа передается только один раз в качестве Серии в функцию.
Может кто-нибудь помочь мне понять, почему это не удается? Я успешно использовал эту функцию во многих наборах данных, с которыми я работаю.
Спасибо