Я просто столкнулся с проблемой нарезки и тут же приземлился. Итак, позвольте мне добавить мои два цента к этому.
Приведем пример из «производственного кода» (или что-то вроде близкого):
Допустим, у нас есть то, что рассылает действия. Например, пользовательский интерфейс центра управления. Этот пользовательский интерфейс должен получить список вещей, которые в настоящее время могут быть отправлены. Поэтому мы определяем класс, содержащий информацию о доставке. Назовем это Action
. Таким образом, Action
имеет некоторые переменные-члены. Для простоты мы имеем только 2, являющиеся std::string name
и a std::function<void()> f
. Затем он имеет void activate()
, который просто выполняет член f
.
Таким образом, пользовательский интерфейс получает std::vector<Action>
. Представьте себе некоторые функции, такие как:
void push_back(Action toAdd);
Теперь мы установили, как это выглядит с точки зрения пользовательского интерфейса. Пока нет проблем. Но какой-то другой парень, который работает над этим проектом, внезапно решает, что существуют специальные действия, требующие дополнительной информации в объекте Action
. По какой причине. Это также можно решить с помощью лямбда-захватов. Этот пример не принимается 1-1 из кода.
Итак, парень происходит от Action
, чтобы добавить свой собственный вкус. Он передает экземпляр своего урожая в класс push_back
, но затем программа переходит в haywire.
Итак, что случилось? Как вы могли предположить : объект был отрезан.
Дополнительная информация из экземпляра потеряна, а f
теперь подвержен неопределенному поведению.
Надеюсь, что в этом примере рассказывается о тех людях, которые не могут себе представить, когда говорят о A
s и B
в какой-то мере.
Результат df.groupby(...)
не является DataFrame. Чтобы вернуть DataFrame, вам нужно применить функцию к каждой группе, преобразовать каждый элемент группы или фильтровать группы.
Кажется, что вам нужен DataFrame, содержащий (1) все ваши оригинальные данные в df
и (2) подсчет количества данных в каждой группе. Эти вещи имеют разную длину, поэтому, если им нужно зайти в один и тот же DataFrame, вам нужно будет перечислять размер избыточно, т. Е. Для каждой строки в каждой группе.
df['size'] = df.groupby(['A','B']).transform(np.size)
(Кроме этого: это полезно, если вы можете показать сжатый ввод проб и ожидаемые результаты.)
Вам нужно transform
size
- len
of df
такое же, как и раньше:
import pandas as pd
df = pd.DataFrame({'A': ['x', 'x', 'x','y','y']
, 'B': ['a', 'c', 'c','b','b']})
print (df)
A B
0 x a
1 x c
2 x c
3 y b
4 y b
df['size'] = df.groupby(['A', 'B'])['A'].transform('size')
print (df)
A B size
0 x a 1
1 x c 2
2 x c 2
3 y b 2
4 y b 2
При необходимости имя столбца в агрегации df
- len
of df
, очевидно, НЕ такое же, как и раньше:
import pandas as pd
df = pd.DataFrame({'A': ['x', 'x', 'x','y','y']
, 'B': ['a', 'c', 'c','b','b']})
print (df)
A B
0 x a
1 x c
2 x c
3 y b
4 y b
df = df.groupby(['A', 'B']).size().reset_index(name='Size')
print (df)
A B Size
0 x a 1
1 x c 2
2 y b 2
df.groupby(['A', 'B']).size().reset_index(name='Size')
Если у меня есть несколько индексов?
– Sotos
26 April 2018 в 12:20
.reset_index().rename(columns='index':'col', 'anothercol':'col2')
– jezrael
26 April 2018 в 13:41
(full_df .set_index('cdatetime') .groupby(['Cluster', 'source', 'action', pd.Grouper(freq = 'H', sort = True)]) .size() .reset_index(['Cluster', 'source', 'action']) .rename(columns={0: 'cnt'}) )
– Sotos
26 April 2018 в 13:44
позволяет сказать, что n - это имя dataframe, а cst - это число элементов, которые повторяются. Ниже приведен код в следующем столбце
cstn=Counter(n.cst)
cstlist = pd.DataFrame.from_dict(cstn, orient='index').reset_index()
cstlist.columns=['name','cnt']
n['cnt']=n['cst'].map(cstlist.loc[:, ['name','cnt']].set_index('name').iloc[:,0].to_dict())
Надеюсь, что это сработает
Встроенный метод объектов .size()
объектов DataFrameGroupBy фактически возвращает объект Series с размерами группы, а не DataFrame. Если вы хотите, чтобы DataFrame, чей столбец был размером группы, индексированный группами, с настраиваемым именем, вы можете использовать метод .to_frame()
и использовать в качестве аргумента имя требуемого столбца.
grpd = df.groupby(['A','B']).size().to_frame('size')
Если вы хотите, чтобы группы были столбцами снова, вы могли бы добавить .reset_index()
в конец.
df['size'] = df.groupby(['A','B']) .A .transform(np.size)
; без.A
вы получаете & quot; ValueError: неправильное количество элементов, переданных 2, размещение подразумевает 1 & quot ;, т. е. получает 2 столбца, необходимо 1 & quot; , – denis 14 July 2017 в 16:35