我有一个像这样的地理坐标的pandas数据框df
:
lat lon
0 48.01025772 -6.15690851
1 48.02164841 -6.10588741
2 48.03302765 -6.05480051
... ... ...
我需要将这些坐标转换为不同的系统,并为此设置专用功能。我计划创建两个新列,df['N']
与lat
配对,df['E']
与lon
配对。
这与函数的外观无关,所以为简单起见,我们称之为 f 。该函数的运行方式如下:E, N = f(float(lat), float(lon))
有没有办法可以遍历df
的所有行,提取lat,lon
对,(计算转换)并将值分配给相关列?
答案 0 :(得分:2)
您可以在df上使用apply
并传递axis=1
,在您的函数中,您应该返回Series
并直接分配2列:
In [207]:
def foo(lat, lon):
return pd.Series([lat + 10, lon * 100])
df[['new_lat','new_lon']] = df.apply(lambda x: foo(x['lat'], x['lon']), axis=1)
df
Out[207]:
lat lon new_lat new_lon
0 48.010258 -6.156909 58.010258 -615.6909
1 48.021648 -6.105887 58.021648 -610.5887
2 48.033028 -6.054801 58.033028 -605.4801
取决于您使用apply
执行的功能可以而且应该避免
答案 1 :(得分:1)
使用熊猫很容易。你想要apply。
答案 2 :(得分:1)
您可以使用:
df[['lat', 'lon']].apply(lambda row: f(float(row['lat']), float(row['lon']), axis=1)
答案 3 :(得分:1)
您可以避免创建pd.Series,因为它会花费很多时间,而应通过传递result_type='expand'
参数。在大型数据框上运行速度明显加快
def foo(lat, lon):
return [lat + 10, lon * 100]
df[['new_lat','new_lon']] = df.apply(lambda x: foo(x['lat'], x['lon']), axis=1, result_type='expand')
在我的数据帧上,实现了以下计时:纯应用(不分配,返回列表)-27秒,result_type='expand'
-30秒,pd.Series(...)返回-41秒。< / p>
答案 4 :(得分:1)
如果您不总是知道返回的列的数目,名称或顺序,则此解决方案更加灵活:
|------------+-------+------------+--------+--------+------------|
| Date | Items | Unit Price | Amount | Amount | Categories |
|------------+-------+------------+--------+--------+------------|
| 2019/09/17 | A | 2.64 | 1 | 2.64 | materials |
| | B | 52.67 | 2 | 105.34 | diagnosis |
| | C | 3.08 | 1 | 3.08 | materials |
| | D | 3.85 | 2 | 7.7 | materials |
| | E | 33.66 | 2 | 67.32 | materials |
| | F | 40 | 1 | 40 | treatments |
| | G | 16.5 | 1 | 16.5 | materials |
| | H | 4 | 3 | 12 | treatments |
| | I | 40 | 1 | 40 | bed |
| | M | 6 | 13 | 78 | treatments |
|------------+-------+------------+--------+--------+------------|
#+TBLFM: $5=$3*$4