作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个针对不同专业的学生大学申请的小型测试数据集看起来像这样
0 35377 female Chemistry False
1 56105 male Physics True
2 31441 female Chemistry False
3 51765 male Physics True
4 53714 female Physics True
形状为 500,4
我需要获得女性的录取率,现在用三种不同的方式解决了这个问题。他们每个人都返回正确的结果。
完成
使用分组依据
female_admitted_rate = df.groupby('gender').get_group('female')[df['admitted'] == True].count()/len(df.groupby('gender').get_group('female'))```
```python
[OUT]
student_id 0.287938
gender 0.287938
major 0.287938
admitted 0.287938
dtype: float64
使用普通的 pandas
len(df[(df['gender']=='female') & (df['admitted'])])/(len(df[df['gender']=='female']))
[Out] 0.28793774319066145
使用查询
len(df.query("gender == 'female' & admitted"))/len(df.query("gender == 'female'"))
[Out] 0.28793774319066145
问题
最佳答案
我想你只需要DataFrame.loc[]
+ Series.mean()
:
df.loc[df['gender'].eq('female'), 'admitted'].mean()
True
被 Series.mean
解释为 1
,False
被解释为 0
>
您可以使用timeit
进行检查
%%timeit
df.loc[df['gender'].eq('female'), 'admitted'].mean()
1.16 ms ± 66.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%%timeit
len(df[(df['gender']=='female') & (df['admitted'])])/(len(df[df['gender']=='female']))
3.45 ms ± 428 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%%timeit
df.groupby('gender').get_group('female')[df['admitted'] == True].count()/len(df.groupby('gender').get_group('female'))
10.3 ms ± 718 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%%timeit
len(df.query("gender == 'female' & admitted"))/len(df.query("gender == 'female'"))
11.1 ms ± 604 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
这些时间适用于示例DataFrame
,我认为性能可能会因DataFrame
的形状而有很大差异。尽管我真诚地相信,除了提供干净简单的语法之外,我提出的方法在大多数情况下都是最快的。
关于python - 如何最有效地访问 pandas 中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61029911/
我是一名优秀的程序员,十分优秀!