python - MemoryError pandas 根据其他列值生成新列
问题描述
我有一个数据框。结构如下:
OMT object
ZIPCODE object
PRODUCT_CAT int64
SERVICE_CATEGORY object
CURRENT_STANDARD_EDD float64
TOTAL int64
DESTINATION_DISTRIBUTION_CTR object
OPS_EDD float64
OPS_EDD_achieve int64
suggest_edd_1 object
suggest_edd_2 int64
suggest_edd_value_1 int64
suggest_edd_value_2 int64
final_edd_group object
final_edd float64
final_edd_value int64
我想执行以下操作:当total
< 5 时,返回 D1/D2/D3/D4/D5/D6 之间的标签值,其中第一个值超过 -1 与 D6 相比。(如果没有,D6)
如果总计 >=5,则返回 D1/D2/D3/D4/D5/D6 之间的标签值,其中第一个值 / d5 与 D6 相比超过 0.95。(如果没有,D6)
我写了以下代码但返回
training_group['suggest_edd_1'] =np.where(training_group['TOTAL']>5,training_group[['D1','D2',
'D3','D4','D5',
'D6']].sub(training_group['D6'],axis =0).ge(-1).assign(D6=True).idxmax(1).str.extract('(\d+)'),
training_group[['D1','D2',
'D3','D4','D5',
'D6']].div(training_group['TOTAL'],axis =0).ge(0.95).assign(D6=True).idxmax(1).str.extract('(\d+)'))
<ipython-input-72-61626eae2be9> in <module>
4 training_group[['D1','D2',
5 'D3','D4','D5',
----> 6 'D6']].div(training_group['TOTAL'],axis =0).ge(OD_pari_target).assign(D6=True).idxmax(1).str.extract('(\d+)'))
MemoryError:
(每个单独的工作,但如果我应用条件TOTAL
它不起作用。
我尝试使用适用于每一行的 lambda 函数,但找不到合适的代码来替换
assign(D6=True)
和extract function
if x['TOTAL'] < piece_threthold:
return x[['D1','D2',
'D3','D4','D5',
'D6']].sub(x['D6'],axis =0).ge(OD_pari_piece).ge(-1).idxmax(1)
else:
return x[['D1','D2',
'D3','D4','D5',
'D6']].div(x['TOTAL'],axis =0).ge(OD_pari_target).ge(-1).idxmax(1)
我可以通过执行以下操作得到我需要的结果。但是,我觉得它的效率非常低,并且创建了更多我不需要的列。(我稍后会放弃suggest_edd_1和suggest_edd_2,因为我只需要final_suggest)
training_group['suggest_edd_1'] = training_group[['D1','D2',
'D3','D4','D5',
'D6']].sub(training_group['D6'],axis =0).ge(OD_pari_piece).assign(D6=True).idxmax(1).str.extract('(\d+)')
training_group['suggest_edd_2'] = training_group[['D1','D2',
'D3','D4','D5',
'D6']].div(training_group['TOTAL'],axis =0).ge(OD_pari_target).assign(D6=True).idxmax(1).str.extract('(\d+)')
training_group['final_suggest'] = np.where(training_group['TOTAL']>5,training_group['suggest_edd_1'] ,training_group['suggest_edd_2'])
解决方案
当您在他们身边时,他们每个人都可以正常工作,预先计算要分配的值
s1=training_group[['D1','D2',
'D3','D4','D5',
'D6']].sub(training_group['D6'],axis =0).ge(-1).assign(D6=True).idxmax(1).str.extract('(\d+)')
s2=training_group[['D1','D2',
'D3','D4','D5',
'D6']].div(training_group['TOTAL'],axis =0).ge(0.95).assign(D6=True).idxmax(1).str.extract('(\d+)')
training_group['suggest_edd_1'] =np.where(training_group['TOTAL']>5,s1,
s2)
推荐阅读
- c# - 为什么我更新数据库后我的数据网格没有更新?
- visual-studio-code - 使用虚拟环境时,vscode 内部人员中的 sys.path 行为不等同于 jupyter lab
- apache-spark - net.snowflake.client.jdbc.SnowflakeSQLException:SQL 访问控制错误:权限不足,无法对架构“PUBLIC”进行操作
- postgresql - 年龄小于或等于一个月评估为 False
- istio - 使用 istio 手动注入 Sidecar 后 Pod 未启动
- reactjs - 我们可以在surveyJS 库中添加欢迎页面吗
- django-rest-framework - DRF 日期时间字段序列化程序“时区的日期时间无效”每年两次
- java - 抽象类有抽象嵌套类;总是必须在使用抽象嵌套类之前强制转换它
- excel - Excel VBA宏来格式化单元格
- ubuntu - DSBulk 加载程序 1.8 版:加载和连接到 Apache Cassandra 时出错