python - 嵌套 for 循环和 if 条件 pandas 替换
问题描述
我有两个不同的熊猫数据框,在第一个数据框(价格)中,我有两列。名为 value 的第一列包含一些值,第二列 amount 包含每个价格的可用金额。第二个数据框(箱)具有一些价格区间作为索引,这些价格区间是从价格数据框产生的。对于价格数据帧的每一行,我检查 value 列的每一行以从 bins 数据帧中找到它所属的区间,如果值在区间内,我在 bins 数据帧中分配可用数量。如果另一个值再次在相同的时间间隔内,我会在 group_bins 数据框中总结这些数量。
import pandas as pd
bins = pd.DataFrame({
'value': [1, 2, 5, 7, 8, 16, 20, 3, 9, 11, 35, 12, 54, 33, 3, 22, 23]
})
price = pd.DataFrame({
'value': [2, 5, 7, 8, 16, 20, 3, 9, 11, 2.5, 3.4],
'amount': [50, 112, 130, 157, 146, 148, 300, 124, 151, 100, 32]
})
bins['bins'] = pd.qcut(bins['value'], 12)
group_bins = bins.groupby(['bins']).sum()
group_bins['amount'] = 0
del group_bins['value']
for j in range(price.shape[0]):
for i in range(group_bins.shape[0]):
if price.loc[j, 'value'] in group_bins.index[i]:
group_bins.loc[group_bins.index[i], 'amount'] += price.loc[j, 'amount']
break
预期结果:
amount
bins
(0.999, 2.333] 50
(2.333, 3.0] 400
(3.0, 5.0] 144
(5.0, 7.333] 130
(7.333, 8.667] 157
(8.667, 11.0] 275
(11.0, 13.333] 0
(13.333, 18.667] 146
(18.667, 22.0] 148
(22.0, 26.333] 0
(26.333, 34.333] 0
(34.333, 54.0] 0
我的问题是我有 100k 数据,所有这些过程都需要很长时间才能完成。是否有任何优雅且更快的方法来替换这些嵌套的 for 循环和 if 条件?
预期结果是 group_bins 数量列中的最后一列。任何帮助将非常感激!谢谢你。
解决方案
如果您for
在数据帧上使用循环,那么您在 99% 的情况下都做错了。试试这个:
bins = pd.DataFrame({
'value': [1, 2, 5, 7, 8, 16, 20, 3, 9, 11, 35, 12, 54, 33, 3, 22, 23]
})
bins['bins'] = pd.qcut(bins['value'], 12)
price = pd.DataFrame({
'value': [2, 5, 7, 8, 16, 20, 3, 9, 11],
'amount': [50, 112, 130, 157, 146, 148, 300, 124, 151]
})
price.merge(bins, how='left', on='value') \
.groupby('bins') \
.agg({'amount': 'sum'})
结果:
amount
bins
(0.999, 2.333] 50
(2.333, 3.0] 600
(3.0, 5.0] 112
(5.0, 7.333] 130
(7.333, 8.667] 157
(8.667, 11.0] 275
(11.0, 13.333] 0
(13.333, 18.667] 146
(18.667, 22.0] 148
(22.0, 26.333] 0
(26.333, 34.333] 0
(34.333, 54.0] 0
推荐阅读
- android - Content Resolver 查询是否一次检索所有数据?
- oracle - Spring Boot Spring Batch:没有 Spring 批处理元数据表的多个 DataSource
- javascript - 如何将原始 mp3 二进制文件转换为 blob url 并在音频标签中播放
- php-7 - 致命错误:未捕获错误:函数名称必须是字符串 - 破坏 wordpress 模板,需要符合 PHP 7
- javascript - 将 React 组件添加到 TinyMCE 编辑器内容
- r - highcharter 中的“variwide”类型不起作用
- python - 使用 Python 读取 Exif:MakerNote IFD 中可能损坏的字段标记 0x0000
- twitter-bootstrap - Twitter 按钮仅显示推文文本,无按钮
- python - 使用 Python 脚本运行完全独立的 powershell 脚本
- python - Python二叉搜索树删除函数