如何计算以熊猫为条件的计数百分比?

时间:2020-10-22 07:05:43

标签: pandas dataframe

我有一个数据框,我想计算某些特定命令的百分比-下面的等式。 $$ \ frac {N(A = a \ quad和\ quad B = 0)} {N(A = a)} $$

id A B
0  a 0
1  b 1
2  c 0
3  a 1
4  a 1

现在我要获得这些特定百分比:

id A B  perc
0  a 0  0.3333
1  b 1  1.0
2  c 0  1.0
3  a 1  0.6666

此外,我想要这个函数,可以按百分比删除行。例如,如果正数1和负数0大致相等,我将删除这些行。

id A B
 0 a 0
 1 a 1
 2 b 0
 3 b 0
 4 b 1

结果将是:

id A B
 2 b 0
 3 b 0
 4 b 1

1 个答案:

答案 0 :(得分:1)

我认为您需要SeriesGroupBy.value_counts

df = df.groupby('A')['B'].value_counts(normalize=True).reset_index(name='perc')
print (df)
   A  B      perc
0  a  1  0.666667
1  a  0  0.333333
2  b  1  1.000000
3  c  0  1.000000

对于第二种解决方案,如果用crosstab除去相同百分比的值,则通过比较两列来获得值A,最后用Series.isin进行过滤,并用~进行反转掩码:

print (df)
   id  A  B
0   0  a  0
1   1  a  1
2   2  b  0
3   3  b  0
4   4  b  1

df1 = pd.crosstab(df['A'], df['B'], normalize='index')
print (df1)
B         0         1
A                    
a  0.500000  0.500000
b  0.666667  0.333333

idx = df1.index[df1[0].eq(df1[1])]
print (idx)
Index(['a'], dtype='object', name='A')

df = df[~df['A'].isin(idx)]
print (df)
   id  A  B
2   2  b  0
3   3  b  0
4   4  b  1