Pandas:将特定功能应用于列并创建其他列
Posted
技术标签:
【中文标题】Pandas:将特定功能应用于列并创建其他列【英文标题】:Pandas: apply a specific function to columns and create other columns 【发布时间】:2017-06-19 19:48:50 【问题描述】:我有一个熊猫数据框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
对(计算它们的转换)并将值分配给相关列?
【问题讨论】:
如果您有兴趣,我编写了一个以矢量化方式计算半正弦的方法,这将使您了解如何重写您的函数所做的任何事情:***.com/questions/25767596/… 【参考方案1】:您可以在 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
执行的操作,可以而且应该避免
【讨论】:
【参考方案2】:您可以避免创建 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')
在我的 Dataframe 上,达到了以下时间:Pure apply(no assignmenting, returns list) - 27 sec, with result_type='expand'
- 30 sec, with return pd.Series(...) - 41 sec.
【讨论】:
【参考方案3】:你可以使用:
df[['lat', 'lon']].apply(lambda row: f(float(row['lat']), float(row['lon']), axis=1)
【讨论】:
【参考方案4】:如果您并不总是知道返回的列的数量、名称或顺序,则此解决方案更灵活:
exploded = df.apply(lambda x: ..., axis='columns', result_type='expand')
return pd.concat([df, exploded], axis='columns', sort=False)
【讨论】:
以上是关于Pandas:将特定功能应用于列并创建其他列的主要内容,如果未能解决你的问题,请参考以下文章
Pandas:groupby A 列并从其他列创建元组列表?
pandas使用split函数将dataframe的特定字符串数据列裂变为两个新的数据列并生成新的dataframe
pandas使用split函数将dataframe中的特定列表字段(list column)裂变为多个数据列并拼接到原dataframe中