Как получить доступ к пандам метода groupBy таблицы данных по основным
как получить доступ к соответствующему фрейму данных groupby в объекте groupby с помощью ключа? Со следующей группой:
rand = np.random.RandomState(1)
df = pd.DataFrame({'A': ['foo', 'bar'] * 3,
'B': rand.randn(6),
'C': rand.randint(0, 20, 6)})
gb = df.groupby(['A'])
Я могу перебирать его, чтобы получить ключи и группы:
In [11]: for k, gp in gb:
print 'key=' + str(k)
print gp
key=bar
A B C
1 bar -0.611756 18
3 bar -1.072969 10
5 bar -2.301539 18
key=foo
A B C
0 foo 1.624345 5
2 foo -0.528172 11
4 foo 0.865408 14
Я хотел бы иметь возможность сделать что-то вроде
In [12]: gb['foo']
Out[12]:
A B C
0 foo 1.624345 5
2 foo -0.528172 11
4 foo 0.865408 14
но когда я это делаю (ну, на самом деле я должен сделать gb[('foo',)]
), Я получаю это странно pandas.core.groupby.DataFrameGroupBy
вещь, которая, кажется, не имеет никаких методов, которые соответствуют фрейму данных, который я хочу.
в лучшее, что я могу придумать, это
In [13]: def gb_df_key(gb, key, orig_df):
ix = gb.indices[key]
return orig_df.ix[ix]
gb_df_key(gb, 'foo', df)
Out[13]:
A B C
0 foo 1.624345 5
2 foo -0.528172 11
4 foo 0.865408 14
но это довольно неприятно, учитывая, как хорошие панды обычно в таких вещах.
Какой встроенный способ сделать это?
5 ответов:
можно использовать
get_group
способ:In [21]: gb.get_group('foo') Out[21]: A B C 0 foo 1.624345 5 2 foo -0.528172 11 4 foo 0.865408 14
Примечание: это не требует создания промежуточного словаря / копии каждого субдатафрама для каждой группы, поэтому будет гораздо более эффективным для памяти, чем создание наивного словаря с
dict(iter(gb))
. Это связано с тем, что он использует структуры данных, уже доступные в объекте groupby.
вы можете выбрать различные столбцы с помощью groupby нарезки:
In [22]: gb[["A", "B"]].get_group("foo") Out[22]: A B 0 foo 1.624345 2 foo -0.528172 4 foo 0.865408 In [23]: gb["C"].get_group("foo") Out[23]: 0 5 2 11 4 14 Name: C, dtype: int64
Уэс Маккинни (автор панд) в Python для анализа данных предоставляет следующий рецепт:
groups = dict(list(gb))
который возвращает словарь, ключи которого являются метками вашей группы и значения которых являются фреймами данных, т. е.
groups['foo']
даст то, что вы ищете:
A B C 0 foo 1.624345 5 2 foo -0.528172 11 4 foo 0.865408 14
, а не
gb.get_group('foo')
Я предпочитаю использовать
gb.groups
df.loc[gb.groups['foo']]
потому что таким образом вы можете выбрать несколько столбцов, а также. например:
df.loc[gb.groups['foo'],('A','B')]
gb = df.groupby(['A']) gb_groups = grouped_df.groups
Если вы ищете выборочные объекты groupby, то выполните: gb_groups.keys (), и введите нужный ключ в следующий key_list..
gb_groups.keys() key_list = [key1, key2, key3 and so on...] for key, values in gb_groups.iteritems(): if key in key_list: print df.ix[values], "\n"
Я искал способ попробовать несколько членов GroupBy obj-пришлось обратиться к опубликованному вопросу, чтобы сделать это.
создать объект groupby
grouped = df.groupdy('some_key')
выберите N фреймов данных и захватить их indicies
sampled_df_i = random.sample(grouped.indicies,N)
возьмите групп
df_list = map(lambda df_i: grouped.get_group(df_i),sampled_df_i)
дополнительно-превратите все это обратно в один объект dataframe
sampled_df = pd.concat(df_list, axis=0, join='outer')