как подсчитать положительные и отрицательные числа столбца после применения groupby в pandas - PullRequest
2 голосов
/ 26 мая 2020

имеют следующий фрейм данных:

      token name   ltp    change
0   12345.0  abc   2.0       NaN
1   12345.0  abc   5.0  1.500000
2   12345.0  abc   3.0 -0.400000
3   12345.0  abc   9.0  2.000000
4   12345.0  abc   5.0 -0.444444
5   12345.0  abc  16.0  2.200000
6    6789.0  xyz   1.0       NaN
7    6789.0  xyz   5.0  4.000000
8    6789.0  xyz   3.0 -0.400000
9    6789.0  xyz  13.0  3.333333
10   6789.0  xyz   9.0 -0.307692
11   6789.0  xyz  20.0  1.222222

Мне нужно подсчитать положительное и отрицательное число для каждой категории столбца имени. в приведенном выше примере

abc:pos_count: 3 abc:neg_count:2
xyz:pos_count:2 xyz:neg_count:2

count=df.groupby('name')['change'].count()
count  

, однако это дает мне только общее количество по группам, но не положительное и отрицательное количество по отдельности.

Ответы [ 3 ]

1 голос
/ 26 мая 2020

Вы можете создать новый столбец в df со знаком change и сгруппировать его по name и подписать:

import pandas as pd
import numpy as np
df['change_sign'] = np.sign(df['change'])
df.groupby(['name','change_sign']).count()

Затем вы можете развернуть, если вам нужен результат в столбцах. рядов

1 голос
/ 26 мая 2020

Используйте:

g = df.groupby('name')['change']
counts = g.agg(
    pos_count=lambda s: s.gt(0).sum(),
    neg_count=lambda s: s.lt(0).sum(),
    net_count=lambda s: s.gt(0).sum()- s.lt(0).sum()).astype(int)

Результат:

# print(counts)
     pos_count  neg_count  net_count
name                                 
abc           3          2          1
xyz           3          2          1
1 голос
/ 26 мая 2020

Используйте np.sign с Series.map для нового столбца, добавленного DataFrame.assign, а затем подсчитайте значения SeriesGroupBy.value_counts:

count=(df.assign(type=np.sign(df['change'])
                      .map({1:'pos_count', -1:'neg_count'}))
        .groupby(df['name'])['type']
        .value_counts()
        .reset_index(name='count'))
print (count)
  name       type  count
0  abc  pos_count      3
1  abc  neg_count      2
2  xyz  pos_count      3
3  xyz  neg_count      2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...