我有一个数据框:
AID Type Co-AID Co-Type
1 A 10 A
1 A 11 B
1 A 12 B
1 A 13 C
1 A 14 D
2 X 15 A
2 X 16 A
2 X 17 X
2 X 18 B
2 X 19 X
2 X 20 X
我想找到与每种类型不同的Co-Types的百分比。
所以结果将是
AID Type PercentDiff
1 A 0.8
2 X 0.5
0.8
是因为Co-Type
中的4/5不是Type A
0.5
是因为Co-Type
中的3/6不是Type X
我知道我可以根据Type
和Co-Type
对它们进行分组并获取每个的计数,但是如何排除类似的类型?
答案 0 :(得分:2)
你可以这样做:
((df['Co-Type'] != df.Type)
.groupby([df.AID, df.Type])
.apply(lambda g: g.sum()/g.size)
.reset_index(name="PercentDiff"))
# AID Type PercentDiff
#0 1 A 0.8
#1 2 X 0.5
答案 1 :(得分:2)
您可以使用:
df.assign(PercentDiff=df['Type'].ne(df['Co-Type']))\
.groupby(['AID','Type'])['PercentDiff'].mean().reset_index()
输出:
AID Type PercentDiff
0 1 A 0.8
1 2 X 0.5
@Psidom Method
%%timeit
((df['Co-Type'] != df.Type)
.groupby([df.AID, df.Type])
.apply(lambda g: g.sum()/g.size)
.reset_index(name="PercentDiff"))
100个循环,最佳3:每循环7.13 ms
此方法没有lambda
%%timeit
(df.assign(PercentDiff=df['Type'].ne(df['Co-Type']))
.groupby(['AID','Type'])['PercentDiff'].mean().reset_index())
100个循环,最佳3:每循环4.42 ms