Подтвердить что ты не робот

Группировать по индексу + столбец в pandas

У меня есть фреймворк с столбцами

  • user_id
  • item_bought

Здесь user_id - это индекс df. Я хочу сгруппировать как user_id, так и item_bought и получить элемент разумного подсчета для пользователя. Как это сделать.

Спасибо

4b9b3361

Ответ 1

это должно работать:

>>> 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 "Возвращаемый вектор значений меток для запрошенного уровня, равный длине индекса"

Ответ 2

Из версии 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

Ответ 3

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

Ответ 4

У меня была та же проблема - импортировал кучу данных, и я хотел сгруппировать поле, которое было индексом. У меня не было мультииндекса или какого-либо джаза, как и у вас.

Я понял, что проблема в том, что поле, которое я хочу, - это индекс, поэтому сначала я просто сбрасываю индекс - но это дает мне бесполезное поле индекса, которое мне не нужно. Так что теперь я делаю следующее:

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" не "на месте" и поэтому не испортит ваш исходный фрейм данных