我有一个数据框,我想计算某些特定命令的百分比-下面的等式。 $$ \ 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
答案 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