Python自定义聚合-需要更有效的解决方案

时间:2018-10-16 13:56:34

标签: python pandas dataframe aggregate bins

我是Python的新手,我正在研究感兴趣的数据集,以帮助我进行学习,尤其是试图更好地理解熊猫和numpy。

我的数据框有超过一百万行,我正在尝试创建一个自定义存储桶,以便可以找到更多有趣的见解。我的数据集如下所示:

我的数据表:

Price    Postal_area    Purchase_Month
123000   SE22           2018_01
240000   GU22           2017_02
.
.
.

我想将数据分组为<100000、200k-300k,300k-500k,500k +的价格段,然后我想按价格段,月份和邮政地区进行分组。我为创建自定义价格时段而感到困惑。

我试图做的是创建一个自定义函数:

def price_range(Price):
    if (Price <= 100000):
        return ("Low Value")
    elif (100000 < Price < 200000):
        return ("Medium Value")
    elif (200001 < Price < 500000):
        return ("Medium High")
    elif (Price > 500001):
        return ("High")
    else:
        return ("Undefined")


然后,我在数据集中创建一个新列,如下所示:

for val in (my_table.Price):
    my_table["price_range"] = (price_range(val))

我应该能够从中创建一个agg,但它的过程极其缓慢-已经在一百万个左右的行上运行了30多分钟,并且仍在运行!

我曾尝试使用numpy和pandas(数据透视表,groupby,lambdas)创建自定义存储桶,但无法弄清楚如何合并自定义存储桶逻辑。

我查看了其他一些答案,例如以下答案,但它没有满足我的特殊自定义需求: Efficient way to assign values from another column pandas df

任何帮助,不胜感激!

2 个答案:

答案 0 :(得分:0)

使用apply函数将自定义函数price_range应用于my_table

my_table['price_range']=my_table['Price'].apply(price_range)

如果要使垃圾箱的距离相等:

my_table['price_range']=pd.cut(my_table['Price'], bins = 4, labels = ['Low Value', 'Medium Value', 'Medium High', 'High'])

答案 1 :(得分:0)

您可以尝试使用pd.cut来削减范围内的值并指定要分配内容的标签 df

    Price
0   12300
1   24000
2   232455
3   343434343


pd.cut(df.Price,[0,100000,200000,500000,np.inf],labels=['Low_value','Medium Value','High','Undefined'])

出局:

0    Medium Value
1            High
2            High
3       Undefined
Name: Price, dtype: category
Categories (4, object): [Low_value < Medium Value < High < Undefined]