次の形式のデータがあります:
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_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