2017-04-18 3 views
1

を返します。Pythonの代替ソリューションscipyのダウンロードの空間距離、現在のソリューションは、私はそのようなデータフレームと機能を持っていたMemoryError

df = pandas.DataFrame({'Car' : ['BMW_1', 'BMW_2', 'BMW_3', 'WW_1','WW_2','Fiat_1', 'Fiat_2'], 
         'distance' : [10,25,22,24,37,33,49]}) 

def my_func(x,y): 
    z = 2x + 3y 
    return z 

私は車によってカバーされた距離の対の組み合わせを取得し、my_funcでそれらを使用していました。しかし、xとyが同じブランドであることはできず、組み合わせは重複してはならないという2つの条件があります。私は各ブランドのための「出力」行の配列から最大の番号を取得したい

Car  Distance Combinations         
0 BMW_1 10   (BMW_1,WW_1),(BMW_1,WW_2),(BMW_1,Fiat_1),(BMW_1,Fiat_1) 
1 BMW_2 25   (BMW_2,WW_1),(BMW_2,WW_2),(BMW_2,Fiat_1),(BMW_2,Fiat_1) 
2 BMW_3 22   (BMW_3,WW_1),(BMW_3,WW_2),(BMW_3,Fiat_1),(BMW_3,Fiat_1) 
3 WW_1 24   (WW_1, Fiat_1),(WW_1, Fiat_2) 
4 WW_2 37   (WW_2, Fiat_1),(WW_2, Fiat_2) 
5 Fiat_1 33   None 
6 Fiat_2 49   None 

//Output 
[120, 134, 156, 178] 
[113, 145, 134, 132] 
[114, 123, 145, 182] 
[153, 123] 
[120, 134] 
None 
None 

次のステップ:所望の出力は次のようなものでした。そして、最終的なデータはMaxUがexccellentの答え私をここに提供

Car Max_Distance 
0 BMW 178 
1 WW 153 
2 Fiat None 

次のようになります。python pandas, a function will be applied to the combinations of the elements in one row based on a condition on the other row

しかし、私は私のデータセットが非常に大きいので、私はスーパーコンピュータでの私のコードを実行しますが、memoryerrorを得続けます。それを達成するためのもっと効率的な方法がありますか?たぶんデータベースに組み合わせを保存して最大値を取得するのでしょうか?だからここ

答えて

1

が第一のもののためのコードです:maxのよう

import pandas as pd 
import itertools as it 

df = pd.DataFrame({'Car' : ['BMW_1', 'BMW_2', 'BMW_3', 'WW_1','WW_2','Fiat_1', 'Fiat_2'], 
         'Distance' : [10,25,22,24,37,33,49]}) 


cars = df['Car'].tolist() 
combos = [a for a in list(it.combinations(cars,2)) if a[0].split('_')[0] != a[1].split('_')[0]] 

maps_combos = {car: [combo for combo in combos if combo[0] == car] for car in cars} 
values = {k:v for k,v in df[['Car', 'Distance']].as_matrix()} 
maps_values = {i: [2*value[0] + 3*value[1] for value in j] for i, j in {k: [map(lambda x: values[x], item) for item in v] for k, v in maps_combos.items()}.items() if j} 

df['Combinations'] = df['Car'].map(maps_combos) 
df['Output'] = df['Car'].map(maps_values) 

、私は休憩を取る必要があります:)

P.S.私は距離の乗算に適切な機能を持っているかどうかはわかりません。

EDIT

この最大のもの(それは確実に良く行うことができます):

df['Max'] = df['Output'].fillna(0).apply(lambda x: max(x) if x != 0 else np.nan) 
df['Brand'] = df['Car'].apply(lambda x: x.split('_')[0]) 
brand_max = df[['Brand', 'Max']].groupby('Brand').max() 
+0

機能が問題それほど:)私は再びメモリエラーを取得する場合、私が見ることはできません。 – edyvedy13

関連する問題