【问题标题】:Pandas: Conditionally fill column using a function based on other columns valuesPandas:使用基于其他列值的函数有条件地填充列
【发布时间】:2017-05-14 13:52:22
【问题描述】:

我有一个 Pandas DataFrame,其中包含两组坐标(lat1、lon1、lat2、lon2)。我有一个使用这些坐标计算距离的函数。但是数据框中的某些行无效。我想仅将我的函数应用于有效行并将函数的结果保存到“dist”列(该列已存在于数据框中)。我想要这样的 SQL:

UPDATE dataframe
SET dist=calculate_dist(lat1, lon1, lat2, lon2)
WHERE lat1 IS NOT NULL AND lat2 IS NOT NULL AND user_id>100;

我怎样才能做到这一点?

我尝试使用df = df.apply(calculate_dist, axis=1),但使用这种方法我需要处理所有行,不仅是与我的条件匹配的行,而且我需要在 calculate_dist 函数中有一个忽略无效行的 if 语句。有没有更好的办法?

我知道 StackOverflow 上已经出现了类似的问题,但我找不到任何同时使用函数和条件选择行的问题。

【问题讨论】:

    标签: python python-3.x pandas indexing mask


    【解决方案1】:

    我认为你需要先过滤boolean indexing

    mask = (df.lat1.notnull()) & (df.lat2.notnull()) & (df.user_id>100)
    
    df['dist'] = df[mask].apply(calculate_dist, axis=1)
    

    示例:

    df = pd.DataFrame({'lat1':[1,2,np.nan,1],
                       'lon1':[4,5,6,2],
                       'lat2':[7,np.nan,9,3],
                       'lon2':[1,3,5,1],
                       'user_id':[200,30,60,50]})
    
    print (df)
       lat1  lat2  lon1  lon2  user_id
    0   1.0   7.0     4     1      200
    1   2.0   NaN     5     3       30
    2   NaN   9.0     6     5       60
    3   1.0   3.0     2     1       50
    
    #function returning Series
    def calculate_dist(x):
        return x.lat2 - x.lat1
    
    mask = (df.lat1.notnull()) & (df.lat2.notnull()) & (df.user_id>100)
    df['dist'] = df[mask].apply(calculate_dist, axis=1)
    print (df)
       lat1  lat2  lon1  lon2  user_id  dist
    0   1.0   7.0     4     1      200   6.0
    1   2.0   NaN     5     3       30   NaN
    2   NaN   9.0     6     5       60   NaN
    3   1.0   3.0     2     1       50   NaN
    

    【讨论】:

      猜你喜欢
      • 2017-01-08
      • 2020-11-17
      • 2021-04-11
      • 1970-01-01
      • 1970-01-01
      • 2023-02-09
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      相关资源
      最近更新 更多