我有一个针对不同专业的学生大学申请的小型测试数据集 看起来像这样
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/