У меня есть 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 в результате?
Рабочий хак состоит в том, чтобы вывести 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 отсчетов.
df.groupby(df.A.astype(str))['B'].value_counts()