我有DataFrame
和列a
和b
,其中b
包含对应于{{的值Y
或N
1}}和True
。
我想按False
分组,然后,对于每个组,获得该组中a
True的平均值除以该组中的行数)。
到目前为止,我所能得到的是
b's (meaning, the number of
但是我想那不是方向。
数据示例:
data['b'] = data['b'].map({'Y': True, 'N': False})
data.groupby('a', as_index=False)['b'].mean()
输出应该是
a b
1 Y
1 Y
1 N
2 Y
2 Y
2 N
2 N
答案 0 :(得分:3)
我会用groupby
和value_counts(normalize=True)
来做到这一点:
df.groupby('a')['b'].value_counts(normalize=True).unstack(1)['Y']
a
1 0.666667
2 0.500000
Name: Y, dtype: float64
无需转换/替换/映射。
答案 1 :(得分:3)
使用crosstab
pd.crosstab(df.a,df.b,normalize='index').Y
Out[336]:
a
1 0.666667
2 0.500000
Name: Y, dtype: float64
答案 2 :(得分:2)
您也可以通过这种方式做到这一点:
df.assign(avg=df.b=='Y').groupby('a')['avg'].mean()
输出:
a
1 0.666667
2 0.500000
Name: avg, dtype: float64
添加reset_index
:
a avg
0 1 0.666667
1 2 0.500000
答案 3 :(得分:1)
numpy.bincount
i, a = data['a'].factorize()
b = (data['b'].values == 'Y')
pd.DataFrame(dict(a=a, avg=np.bincount(i, b) / np.bincount(i)))
a avg
0 1 0.666667
1 2 0.500000