【问题标题】:Pandas: apply a specific function to columns and create other columnsPandas:将特定功能应用于列并创建其他列
【发布时间】: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 对(计算它们的转换)并将值分配给相关列?

【问题讨论】:

标签: python loops pandas dataframe


【解决方案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)
        

        【讨论】:

          猜你喜欢
          • 2019-11-07
          • 2021-12-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-10
          • 1970-01-01
          相关资源
          最近更新 更多