首页 > 解决方案 > 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'])

标签: pythonpandasseries

解决方案


当您在他们身边时,他们每个人都可以正常工作,预先计算要分配的值

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)

推荐阅读