根据值数组的条件在pandas中分配值

时间:2017-12-11 10:49:53

标签: python arrays pandas numpy dataframe

我有一堆数据帧和相同数量的数组,表示这些数据框中price列的间隔(中断数字)

我需要根据这些时间间隔分配名为description_contrib的新列,例如如果价格为16美元且区间数组看起来像[0,10],则表示此行的description_contrib列将为2,因为16大于0且大于10

我想出了这段代码:

def description_contribution(df_cat):
    for i in range(0, len(df_cat)):
        for j in range(0, len(intervals[i])):
            df_cat[i]['description_contrib'].loc[df_cat[i]['price'] >= intervals[i][j]] = j

但它运行缓慢,可能有更强大的解决方案

我如何改善这一点?

UPD 数据看起来像这样

train_id    item_condition_id   brand_name  price   shipping    description_contrib
5644        1                   Unknown     15.0    1           6
12506       1                   Unknown     8.0     1           3
26141       1                   Unknown     20.0    1           8

此数据框的间隔为:

[0.0, 0.0, 6.0, 8.0, 10.0, 12.0, 14.0, 16.0, 20.0, 22.0, 31.0]

2 个答案:

答案 0 :(得分:1)

大多数情况下,加快速度的第一个选择是用向量化操作替换循环。例如,您可以通过以下方式使代码更快,更易读:

import pandas as pd

intervals = [0, 10]
df_cat = pd.DataFrame({'price': range(100)})
df_cat['description_contrib'] = sum(df_cat['price'] > v for v in intervals)

假设df_cat有很多行并且间隔很少,这将为您提供良好的性能。但是,可能存在更快的方式。

答案 1 :(得分:1)

您可以使用numpy数组进行广播比较 -

v = (df.price.values[:, None] > intervals).sum(1)

可以将其分配回df -

df['description_contrib'] = v

需要注意的是内存使用情况,特别是对于较大的数据。速度的公平权衡。