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 中将 lambda 函数应用于列失败

python pandas-将带有两个参数的函数应用于列

Pandas:groupby A 列并从其他列创建元组列表?

pandas使用split函数将dataframe的特定字符串数据列裂变为两个新的数据列并生成新的dataframe

pandas使用split函数将dataframe中的特定列表字段(list column)裂变为多个数据列并拼接到原dataframe中

重新采样 MultiIndexed Pandas DataFrame 并将不同的函数应用于列