Pandas groupby, используя несколько / список столбцов с одинаковыми категориями? - PullRequest
0 голосов
/ 22 октября 2018

Как правило, я хочу превратить:

    Date    0       1       2
0   10-1    thing1  None    None
1   10-1    thing1  thing1  None
2   10-2    thing2  thing1  None
3   10-3    thing1  thing1  thing2

в группу:

    Date    0               
0   10-1    thing1  3
2   10-2    thing1  1
            thing2  1
3   10-3    thing1  2
            thing2  1

Подробности : По сути, у меня сложный столбец "объект"из импорта JSON.Это список диктовок, каждый из которых содержит другой список с интересующим меня содержанием. Мне удалось как «сгладить» этот окончательный список, чтобы разделить столбцы (0,1,2 выше), так и извлечь толькоперечислите себя в столбце (то есть [0,1,2]).Все элементы этих столбцов являются одинаковыми категориальными переменными (thing1, thing2 и т. Д.)

Я мог бы представить, что вы можете создать новые строки для каждого из столбцов 1 и 2, сохраняя их значения в столбцах 0, но если вы можете агрегировать эти значения и группировать напрямую, это было бы здорово.

Ответы [ 4 ]

0 голосов
/ 22 октября 2018

Хорошо, вот еще один ответ.Этот использует get_dummies, потому что мне нравится это конкретное решение.Но на этот раз я собираюсь сделать столбцы с подсчетами для thing1 и thing2:

pd.get_dummies(df, columns=df.columns[1:], prefix="", prefix_sep="")\
    .groupby(axis=1, level=0).sum().groupby('Date').sum()

Результат:

    thing1  thing2
Date        
10-1    3   0
10-2    1   1
10-3    2   1

Я просто подумал, что это было достаточно круто, что я хотелподелись здесь:)

0 голосов
/ 22 октября 2018

Это работает для меня:

df.melt(id_vars='Date').groupby('Date')['value'].value_counts()

вывод:

Date  value 
10-1  thing1    3
10-2  thing1    1
      thing2    1
10-3  thing1    2
      thing2    1

Объяснение: melt помещает все значения из трех столбцов значений в один столбец, сохраняя при этомдата для каждого значения.Затем мы группируем по дате и подсчитываем значения.

Кстати, в приведенном выше примере возвращается серия с мультииндексом Date и value.Если вам нужен фрейм данных, вы можете использовать:

df.melt(id_vars='Date').groupby('Date').agg({'value':'value_counts'})

, который возвращает реальный фрейм данных с той же структурой, поэтому он по-прежнему имеет мультииндекс с уровнями Date и value.

0 голосов
/ 22 октября 2018

Я буду использовать get_dummies, так как он также добавляет недостающий уровень, такой как thing2 в 10-1

pd.get_dummies(df.set_index('Date').replace('None',np.nan),prefix='',prefix_sep='').stack().sum(level=[0,1])
Out[185]: 
Date        
10-1  thing1    3
      thing2    0
10-2  thing1    1
      thing2    1
10-3  thing1    2
      thing2    1
dtype: uint8
0 голосов
/ 22 октября 2018

Должен быть лучший путь, но вот что пришло на ум:

(df.groupby('Date')
   .apply(lambda x: x.drop('Date', axis=1).apply(lambda y: y.value_counts()))
   .sum(axis=1)
   .astype(int))

Date        
10-1  thing1    3
10-2  thing1    1
      thing2    1
10-3  thing1    2
      thing2    1
dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...