python - 如何根据其中一列中的唯一值最好地遍历 DataFrame 上的行?
问题描述
我有一个大约 60K 行的价目表,其中包含大约 5.5K 种不同服务期限的产品。简化后看起来像这样:
dpl_Description w/o months dpl_Order Duration
X 36
X 9
Y 23
F 26
F 7
F 18
X 6
X 4
X 15
Z 35
Z 6
Z 5
C 3
X 34
Y 12
Y 5
(关于那个主题:有没有更好的方法来发布表格?)
如果存在 12 个月的商品(如果此特定产品不能作为 12 个月的商品提供,则所有商品都应保留),我想浏览此列表,并删除任何持续时间不是 12、24 或 36 个月的产品。
这是我目前实现这一目标的代码:
for pwl in pd.unique(result["dpl_Description w/o months"]):
if result[(result["dpl_Description w/o months"] == pwl) & (result["dpl_Order Duration"] == 12)].empty:
pass
else:
for i in result[(result["dpl_Description w/o months"] == pwl) & (result["Charity"] != "Yes")]["dpl_Order Duration"]:
if i in [12, 24, 36]:
else:
result.drop(result[(result["dpl_Description w/o months"] == pwl) & (result["dpl_Order Duration"] == i)].index, inplace=True)
代码运行完成了我想要的,但速度非常慢。鉴于我打算围绕它编写一个函数,并使用相同的方法来处理需要在数据集上完成的各种其他操作,我想获得一些反馈。
解决这个问题的更好方法是什么,从而提高计算的时间效率?
编辑 我已经尝试了以下方法,希望能够加速代码,因为这应该避免大部分循环通过各个持续时间。但是,它仍然运行得非常慢:
for pwl in pd.unique(result["dpl_Description w/o months"]):
if result[(result["dpl_Description w/o months"] == pwl) & (result["dpl_Order Duration"] == 12)].empty:
pass
else:
result.drop(result[~(result["dpl_Order Duration"].isin([12,24,36])) & (result["Charity"] != "Yes") & (result["dpl_Description w/o months"] == pwl)].index, inplace=True)
2. 编辑
根据提供的示例数据集,我期望的输出将是:
X 36
X 9
F 26
F 7
F 18
X 6
X 4
X 15
Z 35
Z 6
Z 5
C 3
Y 12
如前所述,我只希望删除非 12,24 或 36 行,如果相同的产品也在价格表中作为 12 个月的项目。在这种情况下,这只适用于产品“Y”。
解决方案
没有预期的输出,我猜了
df = df[df['dpl_Order Duration'].isin([12, 24, 36])]
dpl_Description w/o months dpl_Order Duration
0 X 36
14 Y 12
推荐阅读
- highcharts - 除非数据点超过最小/最大网格线,否则如何停止 Highcharts 在图表的末端创建新的网格线?
- r - 根据某些条件查找持续时间
- amazon-web-services - Amazon AWS SQS 队列消息保留期
- angular - RxJS:TypeError:您在预期流的位置提供了无效对象。您可以提供 Observable、Promise、Array 或 Iterable
- javascript - For in 循环不会遍历对象的每个项目
- android - 如何使应用发布符合 Google Play 64 位要求 Google 错误
- php - 如何使用 PHP 生成多个 PDF 并通过电子邮件附件发送?
- swift - 协议一致性检查
- docker - portainer.io 的入口点不像在 Docker 映像中那样工作
- java - 如何使用 Spring Boot/Spring Data 实现历史数据更改