Ume*_*man 2 python runtime dataframe pandas
假设我有一个像这样的 pandas 数据框:
| 医生 | 病人 | 天 |
|---|---|---|
| 亚伦 | 杰夫 | 23 |
| 亚伦 | 乔什 | 46 |
| 亚伦 | 乔什 | 71 |
| 杰西 | 曼尼 | 55 |
| 杰西 | 曼尼 | 85 |
| 杰西 | 曼尼 | 46 |
我想提取医生和患者的组合多次出现的数据帧。我将对采购的数据框进行进一步的工作。
例如,在这个例子中,数据框
| 医生 | 病人 | 天 |
|---|---|---|
| 亚伦 | 乔什 | 46 |
| 亚伦 | 乔什 | 71 |
将被提取和数据帧
| 医生 | 病人 | 天 |
|---|---|---|
| 杰西 | 曼尼 | 55 |
| 杰西 | 曼尼 | 85 |
| 杰西 | 曼尼 | 46 |
将被提取。
根据我的情况,dataframe
| 医生 | 病人 | 天 |
|---|---|---|
| 亚伦 | 杰夫 | 23 |
不会被提取因为 Aaron 和 Jeff 的组合只出现一次。
现在,我有一个包含 400000 行的数据帧,我认为到目前为止我编写的代码在获取我想要的数据帧方面效率很低。这是代码:
doctors = list(df_1.Doctor.unique()) # df_1 being the dataframe with 400K rows
for doctor in doctors:
df_2 = df_1[df_1['Doctor'] == doctor] # extract one sub-dataframe per doctor
patients = list(df_2.Patient.unique())
for patient in patients:
df_3 = df_2[df_2['patient'] == patient] # extract one sub-sub-dataframe per doctor and patient
if len(df_3) >= 2:
# do something
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,这已经接近 O(n^2) 运行时间(我说接近是因为每列中没有 400K 个唯一值)。有没有办法最小化运行时间?如果是这样,我的代码该如何改进?
谢谢!
乌梅什
您可以检查groupby
d = {x : y for x, y in df.groupby(['Doctor','Patient']) if len(y) > 1}
d
Out[36]:
{('Aaron', 'Josh'): Doctor Patient Days
1 Aaron Josh 46
2 Aaron Josh 71, ('Jess', 'Manny'): Doctor Patient Days
3 Jess Manny 55
4 Jess Manny 85
5 Jess Manny 46}
Run Code Online (Sandbox Code Playgroud)