Подсчет значений столбцов на основе значений в других столбцах для кадров данных Pandas - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь подсчитать количество каждой категории штормов для каждой уникальной комбинации x и y.Например.Мой фрейм данных выглядит так:

x   y  year  Category
1   1  1988     3
2   1  1977     1
2   1  1999     2
3   2  1990     4

Я хочу создать фрейм данных, который выглядит следующим образом:

x   y   Category 1   Category 2   Category 3  Category 4
1   1        0           0            1           0
2   1        1           1            0           0
3   2        0           0            0           1

Я пробовал различные комбинации .groupby() и .count(), но ядо сих пор не получается желаемый результат.Вот что я могу получить:

df[['x','y','Category']].groupby(['Category']).count()

Однако результат учитывается для всех x и y, а не для уникальных пар:

Cat       x           y     
1       3773         3773
2       1230         1230
3       604          604
4       266          266
5       50           50
NA      27620        27620
TS      16884        16884

Кто-нибудь знает, каквыполнить операцию подсчета для одного столбца на основе уникальности двух других столбцов в кадре данных?

Ответы [ 4 ]

0 голосов
/ 05 февраля 2019

Вы можете использовать pd.get_dummies после установки индекса, используя set_index, затем используйте sum с параметром level, чтобы свернуть строки:

pd.get_dummies(df.set_index(['x','y'])['Category'].astype(str),
               prefix='Category ', 
               prefix_sep='')\
  .sum(level=[0,1])\
  .reset_index()

Вывод:

   x  y  Category 1  Category 2  Category 3  Category 4
0  1  1           0           0           1           0
1  2  1           1           1           0           0
2  3  2           0           0           0           1
0 голосов
/ 05 февраля 2019

Или используйте groupby дважды, с большим количеством дополнительных, то есть get_dummies с apply и т.д ...

Как:

>>> df.join(df.groupby(['x','y'])['Category']
           .apply(lambda x: x.astype(str).str.get_dummies().add_prefix('Category ')))
           .groupby(['x','y']).sum().fillna(0).drop(['year','Category'],1).reset_index()
   x  y  Category 1  Category 2  Category 3  Category 4
0  1  1         0.0         0.0         1.0         0.0
1  2  1         1.0         1.0         0.0         0.0
2  3  2         0.0         0.0         0.0         1.0
>>> 
0 голосов
/ 05 февраля 2019

Вы можете использовать groupby сначала:

df_new = df.groupby(['x', 'y', 'Category']).count()
df_new
                  year  count
x   y   Category        
1   1      3       1    1
2   1      1       1    1
           2       1    1
3   2      4       1    1

Затем сводная таблица

df_new = df_new.pivot_table(index=['x', 'y'], columns='Category', values='count', fill_value=0)
df_new
Category    1   2   3   4
x   y               
1   1       0   0   1   0
2   1       1   1   0   0
3   2       0   0   0   1
0 голосов
/ 05 февраля 2019

pivot_table звучит так, как вы хотите.Немного взломать - добавить столбец 1 для подсчета.Это позволяет pivot_table добавлять 1 для каждого вхождения определенной комбинации x - y и Category.Этот новый столбец будет установлен в качестве параметра value в pivot_table, а параметр aggfunc - в np.sum.Возможно, вы также захотите установить fill_value на 0:

df['count'] = 1
result = df.pivot_table(
    index=['x', 'y'], columns='Category', values='count',
    fill_value=0, aggfunc=np.sum
)

result:

Category  1  2  3  4
x y                 
1 1       0  0  1  0
2 1       1  1  0  0
3 2       0  0  0  1

Если вы заинтересованы в сохранении x и y в качестве столбцов и с именами других столбцов как Category X, вы можете переименовать столбцы и использовать reset_index:

result.columns = [f'Category {x}' for x in result.columns]
result = a.reset_index()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...