Таблицы данных Python: как я могу вернуть количество вхождений в столбце? - PullRequest
2 голосов
/ 07 ноября 2019

Я работаю с большим CSV-файлом, в котором есть информация, похожая на

id      year   decade  code  type
3366    2014    2010    EM  Chemical
3366    2014    2010    EM  Chemical
3366    2014    2010    EM  Chemical
3366    2014    2010    EM  Chemical
3366    2014    2010    EM  Chemical
427     1972    1970    DR  Coastal Storm
337     1972    1970    DR  Coastal Storm
337     1972    1970    DR  Coastal Storm

Я бы хотел отсортировать по количеству уникальных вхождений в столбце 'id'. Мой желаемый результат будет выглядеть примерно так:

id      year   decade  code  type          count
3366    2014    2010    EM  Chemical        5
427     1972    1970    DR  Coastal Storm   1
337     1972    1970    DR  Coastal Storm   2

Однако я пытался довольствоваться чем-то вроде

id      year   decade  code  type           count
3366    2014    2010    EM  Chemical        5
3366    2014    2010    EM  Chemical        5
3366    2014    2010    EM  Chemical        5
3366    2014    2010    EM  Chemical        5
3366    2014    2010    EM  Chemical        5
427     1972    1970    DR  Coastal Storm   1
337     1972    1970    DR  Coastal Storm   1
337     1972    1970    DR  Coastal Storm   2

Я пытался сделать это, пытаясь

df['count']=df.groupby('id').transform('count')

Но я продолжаю получать сообщение об ошибке

ValueError: Wrong number of items passed 18, placement implies 1

Есть ли лучший способ сделать это?

Ответы [ 2 ]

2 голосов
/ 07 ноября 2019
df.groupby(list(df.columns)).size().reset_index().rename(columns={0:'count'})
  • .size() даст вам счет, но создаст многоуровневый индекс
  • .reset_index() избавится от многоуровневого индекса с счетами, содержащимися в столбце с именем0
  • .rename(columns = {0:'count'}) переименует этот столбец для подсчета

Вы можете использовать преобразование, но убедитесь, что вы пропустили серию той же длины, что и ваш кадр данных. Вы можете сделать это, добавив ['year'] к вашей группе, но любой из ваших столбцов будет делать:

df['counts'] = df.groupby('id')['year'].transform('count')
0 голосов
/ 07 ноября 2019

Для первого желаемого решения:

data = data.groupby(['id',  'year', 'decade',   'code', 'type']).id.count()
data
id    year  decade  code  type         
337   1972  1970    DR    Coastal Storm    2
427   1972  1970    DR    Coastal Storm    1
3366  2014  2010    EM    Chemical         5
Name: id, dtype: int64

Для второго:

data['count'] = data.groupby(['id', 'year', 'decade',   'code', 'type']).id.transform('count')
data
id  year    decade  code    type    count
0   3366    2014    2010    EM  Chemical    5
1   3366    2014    2010    EM  Chemical    5
2   3366    2014    2010    EM  Chemical    5
3   3366    2014    2010    EM  Chemical    5
4   3366    2014    2010    EM  Chemical    5
5   427 1972    1970    DR  Coastal Storm   1
6   337 1972    1970    DR  Coastal Storm   2
7   337 1972    1970    DR  Coastal Storm   2

Данные:

id;year;decade;code;type
3366;2014;2010;EM;Chemical
3366;2014;2010;EM;Chemical
3366;2014;2010;EM;Chemical
3366;2014;2010;EM;Chemical
3366;2014;2010;EM;Chemical
427;1972;1970;DR;Coastal Storm
337;1972;1970;DR;Coastal Storm
337;1972;1970;DR;Coastal Storm

import pandas as pd
data = pd.read_clipboard(sep=';')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...