2016-06-25 36 views
1

我使用来自lon和纬度分量的风速计算功能:如何计算多列作为参数的熊猫列?

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

,把它从两个现有的计算新的熊猫柱:

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

由于我在Python 2.7改变到Python 3.5的功能不再工作。改变是否是原因?

在一个参数(列)函数:

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

我现在使用:

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

,它工作正常。

你能帮我吗?

+0

但功能'map'改变? – Hugo

回答

1

我会试着坚持现有numpy的/ SciPy的功能,因为它们是非常快速和优化(numpy.hypot):

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()功能:

def celsius(T): 
    # using vectorized function: np.round() 
    return np.round(T - 273, 1) 
1

如果想使用map,加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, ...)

返回适用功能的迭代每一个项目,产生结果的迭代器。如果传递额外的迭代参数,函数必须采用多个参数并应用于并行所有迭代中的项目。使用多个迭代器时,当最短迭代器耗尽时,迭代器停止。对于函数输入已经安排到参数元组中的情况,请参阅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