У меня есть фреймворк с столбцами
- user_id
- item_bought
Здесь user_id - это индекс df. Я хочу сгруппировать как user_id, так и item_bought и получить элемент разумного подсчета для пользователя. Как это сделать.
Спасибо
У меня есть фреймворк с столбцами
Здесь user_id - это индекс df. Я хочу сгруппировать как user_id, так и item_bought и получить элемент разумного подсчета для пользователя. Как это сделать.
Спасибо
это должно работать:
>>> df = pd.DataFrame(np.random.randint(0,5,(6, 2)), columns=['col1','col2'])
>>> df['ind1'] = list('AAABCC')
>>> df['ind2'] = range(6)
>>> df.set_index(['ind1','ind2'], inplace=True)
>>> df
col1 col2
ind1 ind2
A 0 3 2
1 2 0
2 2 3
B 3 2 4
C 4 3 1
5 0 0
>>> df.groupby([df.index.get_level_values(0),'col1']).count()
col2
ind1 col1
A 2 2
3 1
B 2 1
C 0 1
3 1
У меня была такая же проблема, используя один из столбцов из multiindex. с multiindex, вы не можете использовать df.index.levels [0], так как он имеет только разные значения с этого конкретного уровня индекса и будет, скорее всего, разного размера, чем целая датафрейма...
check http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Index.get_level_values.html - get_level_values "Возвращаемый вектор значений меток для запрошенного уровня, равный длине индекса"
Из версии 0.20.1 это проще:
Строки, переданные в DataFrame.groupby(), поскольку параметр по теперь может ссылаться на имена столбцов или имена индекса уровня
arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
index = pd.MultiIndex.from_arrays(arrays, names=['first', 'second'])
df = pd.DataFrame({'A': [1, 1, 1, 1, 2, 2, 3, 3],
'B': np.arange(8)}, index=index)
print (df)
A B
first second
bar one 1 0
two 1 1
baz one 1 2
two 1 3
foo one 2 4
two 2 5
qux one 3 6
two 3 7
print (df.groupby(['second', 'A']).sum())
B
second A
one 1 2
2 4
3 6
two 1 4
2 5
3 7
import pandas as pd
import numpy as np
In [11]:
df = pd.DataFrame()
In [12]:
df['user_id'] = ['b','b','b','c']
In [13]:
df['item_bought'] = ['x','x','y','y']
In [14]:
df['ct'] = 1
In [15]:
df
Out[15]:
user_id item_bought ct
0 b x 1
1 b x 1
2 b y 1
3 c y 1
In [16]:
pd.pivot_table(df,values='ct',index=['user_id','item_bought'],aggfunc=np.sum)
Out[16]:
user_id item_bought
b x 2
y 1
c y 1
У меня была та же проблема - импортировал кучу данных, и я хотел сгруппировать поле, которое было индексом. У меня не было мультииндекса или какого-либо джаза, как и у вас.
Я понял, что проблема в том, что поле, которое я хочу, - это индекс, поэтому сначала я просто сбрасываю индекс - но это дает мне бесполезное поле индекса, которое мне не нужно. Так что теперь я делаю следующее:
grouped = df.reset_index().groupby(by=['Field1','Field2'])
тогда я могу использовать "сгруппированную" кучу способов для разных отчетов
grouped[['Field3','Field4']].agg([np.mean, np.std])
(это было то, что я хотел, давая мне средние значения Field4 и Field3, сгруппированные по Field1 (индекс) и Field2
Для вас, если вы просто хотите сделать подсчет элементов, в одной простой строке, используя groupby, код может быть
df.reset_index().groupby(by=['user_id','item_bought']).count()
Если вы хотите сделать больше вещей, то вы можете (как и я) создать "сгруппированный", а затем использовать это. Как новичку, мне легче следовать этим путем.
Обратите внимание, что "reset_index" не "на месте" и поэтому не испортит ваш исходный фрейм данных