Счетчик значений по группе не показывает счетчик значений NULL / NA в пандах

1

У меня есть dataframe, который выглядит как this-

>>> df
     A     B
0  1.0  good
1  2.0  good
2  1.0  good
3  2.0  good
4  1.0   bad
5  1.0   bad
6  2.0   bad
7  2.0   bad
8  NaN  good

Я хочу получить количество значений столбца B на основе различных значений в столбце A. Поэтому я использую groupby следующим образом и получаю result-

>>> df.groupby('A')['B'].value_counts()
A    B   
1.0  bad     2
     good    2
2.0  bad     2
     good    2
Name: B, dtype: int64

Но он не показывает счет для значения nan в столбце A. Я действительно хочу показать счет для NaN как well-

A    B   
1.0  bad     2
     good    2
2.0  bad     2
     good    2
NaN  good    1
Name: B, dtype: int64

Я даже пытался использовать dropna = False, но это также не показывает ожидаемый результат.
Может ли кто-нибудь сказать мне, как получить NaN в результате?

Теги:
pandas

1 ответ

3
Лучший ответ

Рабочий хак состоит в том, чтобы вывести A в строку.

df.assign(A=df.A.astype(str)).groupby('A')['B'].value_counts()

Или, более кратко,

df.groupby(df.A.astype(str))['B'].value_counts()

A    B   
1.0  bad     2
     good    2
2.0  bad     2
     good    2
nan  good    1
Name: B, dtype: int64

groupby по умолчанию помещает NaNs (отсутствующие данные) в группу, поэтому даже на этапе value_counts даже не рассматривается.

Вдоль тех же строк вы также можете рассмотреть использование crosstab.

pd.crosstab(df.A.astype(str), df.B, dropna=False).stack()

A    B   
1.0  bad     2
     good    2
2.0  bad     2
     good    2
nan  bad     0
     good    1
dtype: int64

Который также дает вам 0 отсчетов.

  • 0
    Зачем назначать, когда вы можете передать это как группировщик, т.е. df.groupby(df.A.astype(str))['B'].value_counts()
  • 1
    @ В общем, группировка в пользовательском группировщике в 3 раза медленнее, чем в существующем столбце. Я подумал об этом и решил пойти с более производительным вариантом, но, думаю, не мешало бы указать их оба и позволить OP выбирать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню