web-dev-qa-db-ja.com

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

ループを使用せずに、これをよりきれいに行う方法があると確信していますが、うまくいかないようです。どんな助けでも大歓迎です。

19
user1684046

これは、一意の値だけでなく他の集計関数を計算する場合のソリューションへの単なるアドオンです。

df.groupby(['group']).agg(['min','max','count','nunique'])

あなたがそれが有用であると思うことを望みます

15
datapug