1. ホーム
  2. python

[解決済み] pandasのgroupbyを使ってユニークな値を数える

2023-06-17 07:27:36

質問

以下のような形式のデータがあります。

df = pd.DataFrame({
    'group': [1, 1, 2, 3, 3, 3, 4],
    'param': ['a', 'a', 'b', np.nan, 'a', 'a', np.nan]
})
print(df)

#    group param
# 0      1     a
# 1      1     a
# 2      2     b
# 3      3   NaN
# 4      3     a
# 5      3     a
# 6      4   NaN

グループ内の非NULL値は常に同じである。私は各グループの非NULL値(それが存在する場合)を一度カウントし、その後、各値の合計カウントを見つけたいのです。

私は現在、以下のような(不格好で非効率的な)方法でこれを行なっています。

param = []
for _, group in df[df.param.notnull()].groupby('group'):
    param.append(group.param.unique()[0])
print(pd.DataFrame({'param': param}).param.value_counts())

# a    2
# b    1

ループを使わずにもっときれいにできる方法があると思うのですが、どうしてもうまくいきません。どんな助けでも大いに感謝されるでしょう。

どのように解決するのですか?

私はあなたが使用することができると思います SeriesGroupBy.nunique :

print (df.groupby('param')['group'].nunique())
param
a    2
b    1
Name: group, dtype: int64

もう一つの解決策は unique を使用し、次に新しい df によって DataFrame.from_records にシェイプします。 Series stack そして最後に value_counts :

a = df[df.param.notnull()].groupby('group')['param'].unique()
print (pd.DataFrame.from_records(a.values.tolist()).stack().value_counts())
a    2
b    1
dtype: int64