2014-09-19 250 views
0

操作我也加入了與5個字段命名爲大熊貓數據幀:蟒蛇,在大的熊貓數據幀

product | price | percentil_25 | percentil_50 | percentile_75 

的每一行我想上課的價格是這樣的:

如果價格低於percentil_25我給這個產品類1,依此類推

因此,我所做的是:

classe_final = OrderedDict() 
classe_final['sku'] = [] 
classe_final['class'] = [] 

for index in range(len(joined)): 
    classe_final['sku'].append(joined.values[index][0]) 
    if(float(joined.values[index][1]) <= float(joined.values[index][2])): 
     classe_final['class'].append(1) 
    elif(float(joined.values[index][2]) < float(joined.values[index][1]) and float(joined.values[index][1]) <= float(joined.values[index][3])): 
     classe_final['class'].append(2) 
    elif(float(joined.values[index][3]) < float(joined.values[index][1]) and float(joined.values[index][1]) <= float(joined.values[index][4])): 
     classe_final['class'].append(3) 
    else: 
     classe_final['class'].append(4) 

但是,因爲我的DataFrame非常大,所以它會一直持續下去。

你有什麼想法我可以做得更快嗎?

+0

對不起你只是想確定類產品的依賴,其價格落在每一個百分點?所以<25級1,> = 25和<50級2 ..... – EdChum 2014-09-19 07:50:52

+0

是exaclty @EdChum – woshitom 2014-09-19 07:56:58

+0

對不起,我剛剛注意到你正在使用一個有序的字典來存儲你的值,所以我的答案是不正確的,你想要什麼生產?你的代碼將產生一個以產品爲關鍵詞的詞典,然後每個類別的產品價格列表也是屬於這個詞典的,這是否正確?你可以展示一個玩具樣本數據集和預期的輸出 – EdChum 2014-09-19 08:14:23

回答

0
# build an empty df 
df = pd.DataFrame() 
# get a list of the unique products, could skip this perhaps 
df['Product'] = other_df['Sku'].unique() 

2種方式,定義FUNC並調用應用

def class(x): 
    if x.price < x.percentil_25: 
     return 1 
    elif x.price >= x.percentil_25 and x.price < x.percentil_50: 
     return 2: 
    elif x.price >= x.percentil_50 and x.price < x.percentil_75: 
     return 2: 
    elif x.price >= x.percentil_75: 
     return 4 

df['class'] = other_df.apply(lambda row: class(row'), axis=1) 

另一種方式我認爲這是更好,會快很多的,我們可以在「類」列添加到您現有的DF和使用loc,然後只取感興趣的2列的觀點:

joined.loc[joined['price'] < joined['percentil_25'], 'class'] =1 
joined.loc[(joined['price'] >= joined['percentil_25']) & (joined['price'] < joined['percentil_50']), 'class'] =2 
joined.loc[(joined['price'] >= joined['percentil_50']) & (joined['price'] < joined['percentil_75']), 'class'] =3 
joined.loc[joined['price'] >= joined['percentil_75'], 'class'] =4 

classe_final = joined[['cku', 'class']] 

只是踢你可以使用的np.where條件負載:

classe_final['class'] = np.where(joined['price'] > joined['percentil_75'], 4, np.where(joined['price'] > joined['percentil_50'], 3, np.where(joined['price'] > joined['percentil_25'], 2, 1))) 

此評估價格是否大於percentil_75大,如果是的話,則class 4否則它計算另一個conditiona等,可能是值得的時序此相比LOC但它是少了很多可讀

+0

謝謝,我絕對使用第二種解決方案!它非常快,再次感謝! – woshitom 2014-09-19 09:19:53

+0

@ user1754181你也可以使用它;),從這裏取得的東西是爲了避免循環和使用apply,除非它是不可能的,你想要做的就是找到是否引導你的操作,那就是執行你的操作整個數據幀或系列,而不是一次一行。 – EdChum 2014-09-19 09:21:37

+0

是的我知道你的意思,我更習慣於sql,pandas對我來說有點新穎 – woshitom 2014-09-19 09:28:57

0

另一個解決辦法,如果有人問我打賭哪一個是我會去這樣做的最快:

joined.set_index("product").eval(
    "1 * (price >= percentil_25)" 
    " + (price >= percentil_50)" 
    " + (price >= percentil_75)" 
) 
+0

它在可讀性和可維護性方面比性能更好:)。雖然沒有測試,'loc'非常快。 @ user1754181,你有任何測試數據可用嗎? – filmor 2014-09-19 09:11:09

+0

在我的機器上檢查最後實現的速度比接受的解決方案快一個數量級(對於1M行,數據幀爲30ms vs 300ms)。 – filmor 2014-09-19 09:27:31