pandas groupbyを使用して一意の値をカウントする [重複] 質問する

pandas groupbyを使用して一意の値をカウントする [重複] 質問する

次の形式のデータがあります:

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 値を 1 回カウントし、各値の合計数を見つけたいと思います。

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

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

ループを使用せずに、よりきれいにこれを行う方法があるはずですが、どうもうまくいきません。どなたか助けていただければ幸いです。

ベストアンサー1

使えると思いますSeriesGroupBy.nunique:

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

別の解決策unique、次に新しいものを作成しdfますDataFrame.from_recordsSeriesによって形を変える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

おすすめ記事