2016-06-25 3 views
1

私は経度と緯度のコンポーネントから風速演算機能を使用していました:複数の列を持つpandas列を引数として計算するにはどうすればよいですか?

def wind_speed(u, v): 
    return np.sqrt(u ** 2 + v ** 2) 

と2個の既存のものから新しいパンダの列を計算するためにそれを呼び出す:私は、Python 2.7から変更したので

df['wspeed'] = map(wind_speed, df['lonwind'], df['latwind']) 

をPython 3.5では、この関数はもう動作しません。変化が原因だろうか?単一の引数(列)関数で

def celsius(T): 
    return round(T - 273, 1) 

私は今使用しています:

df['temp'] = df['t2m'].map(celsius) 

そして、それは正常に動作しますが。

お手伝いできますか?

+0

しかし、変更map'関数 'でしたか? – Hugo

答えて

1

私は、彼らが(numpy.hypot)非常に高速かつ最適化され、既存のnumpyの/ scipyのダウンロード機能に固執しようとする:

df['wspeed'] = np.hypot(df.latwind, df.lonwind) 

タイミング: 300Kに対する行DF:

In [47]: df = pd.concat([df] * 10**5, ignore_index=True) 

In [48]: df.shape 
Out[48]: (300000, 2) 

In [49]: %paste 
def wind_speed(u, v): 
    return np.sqrt(u ** 2 + v ** 2) 

## -- End pasted text -- 

In [50]: %timeit list(map(wind_speed, df['lonwind'], df['latwind'])) 
1 loop, best of 3: 922 ms per loop 

In [51]: %timeit np.hypot(df.latwind, df.lonwind) 
100 loops, best of 3: 4.08 ms per loop 

結論:ベクトル化アプローチは230倍高速でした。

def wind_speed(u, v): 
    # using vectorized approach - column's math instead of scalar 
    return np.sqrt(u * u + v * v) 

df['wspeed'] = wind_speed(df['lonwind'] , df['latwind']) 

デモ:

In [39]: df['wspeed'] = wind_speed(df['lonwind'] , df['latwind']) 

In [40]: df 
Out[40]: 
    latwind lonwind wspeed 
0  4  1 4.123106 
1  5  2 5.385165 
2  6  3 6.708204 

同じベクトル化されたアプローチcelsius()機能付:あなたがあなた自身のものを書かなければならない場合はには、(代わりにスカラーのベクトル/列での作業)ベクトル化数学を使用しようと

mapを使用したい場合は
def celsius(T): 
    # using vectorized function: np.round() 
    return np.round(T - 273, 1) 
1

list追加:

df = pd.DataFrame({'lonwind':[1,2,3], 
        'latwind':[4,5,6]}) 

print (df) 
    latwind lonwind 
0  4  1 
1  5  2 
2  6  3 

def wind_speed(u, v): 
    return np.sqrt(u ** 2 + v ** 2) 

df['wspeed'] = list(map(wind_speed, df['lonwind'], df['latwind'])) 

print (df) 
    latwind lonwind wspeed 
0  4  1 4.123106 
1  5  2 5.385165 
2  6  3 6.708204 

listなし:

df['wspeed'] = (map(wind_speed, df['lonwind'], df['latwind'])) 
print (df) 
    latwind lonwind        wspeed 
0  4  1 <map object at 0x000000000AC42DA0> 
1  5  2 <map object at 0x000000000AC42DA0> 
2  6  3 <map object at 0x000000000AC42DA0> 

map(function, iterable, ...)

戻る結果をもたらす、反復可能の項目ごとに関数を適用するイテレータ。追加の反復可能な引数が渡された場合、関数はその多くの引数をとり、すべてのiterableの項目に並列に適用されます。複数のiterableがある場合、iteratorは最短のiterableが使い果たされると停止します。関数の入力がすでに引数タプルに配置されている場合は、itertools.starmap()を参照してください。

別の解決策:

df['wspeed'] = (df['lonwind'] ** 2 + df['latwind'] ** 2) **0.5 
print (df) 
    latwind lonwind wspeed 
0  4  1 4.123106 
1  5  2 5.385165 
2  6  3 6.708204 
関連する問題