[英]Assign values in pandas based on condition on array of values
我有一堆數據框和相同數量的數組,這些數組代表這些數據框的price
列中的間隔(破折號)
我需要根據這些時間間隔分配一個名為description_contrib
的新列,例如,如果價格為16 USD,並且時間間隔數組看起來像[0,10]
,這意味着該行的description_contrib
列將為2,因為16大於0且也大於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]
在大多數情況下,加快處理速度的第一個選擇是用向量化操作替換循環。 例如,您可以通過以下方式使代碼更快,更易讀:
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有許多行並且間隔很少,這將為您帶來良好的性能。 不過,可能存在更快的方法。
您可以對numpy數組進行廣播比較-
v = (df.price.values[:, None] > intervals).sum(1)
可以將其分配回df
df['description_contrib'] = v
需要注意的是內存使用情況,特別是對於較大的數據。 公平地權衡速度。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.