【问题标题】:Pandas - skip NULL value in calculationPandas - 在计算中跳过 NULL 值
【发布时间】:2019-05-18 06:33:28
【问题描述】:

我需要将字段添加到我的 DataFrame 中,计算位置 A 和位置 B 之间的距离。我有这段代码适用于非空坐标的字段:

df['Distance_AB'] = df.apply(lambda x: great_circle((x['latitude_A'],x['longitude_A']), (x['latitude_B'], x['longitude_B'])).meters, axis=1).round()

但是当它遇到空字段时会抛出错误:

ValueError: ('点坐标必须是有限的。(nan, nan, 0.0) 有 已作为坐标传递。', u'发生在索引 2881')

如何保证大圆距离公式不会收到NULL值(没有坐标时会跳过距离计算)?我知道pd.notnull() 函数,但它返回TrueFalse

【问题讨论】:

标签: python pandas dataframe null valueerror


【解决方案1】:

我假设您的函数 great_circle 不可矢量化,或者矢量化超出了您的问题的范围。由于 pd.DataFrame.apply 已经是 Python 级别的循环,因此您可以使用带有 try / except 的显式函数,而不会产生大量额外开销:

def calculator(row):
    lat_A, long_A = row['latitude_A'], row['longitude_A']
    lat_B, long_B = row['latitude_B'], row['longitude_B']
    try:
        return great_circle((lat_A, long_A), (lat_B, long_B)).meters
    except ValueError:
        return np.nan

df['Distance_AB'] = df.apply(calculator, axis=1).round()

【讨论】:

  • 非常感谢。尝试/除了工作正常。我只收到此警告消息,但输出看起来不错(尽管由于数据量大而难以验证):AppData\Local\Continuum\anaconda2\lib\site-packages\pandas\core\series.py:1828: RuntimeWarning: invalid rint 结果中遇到的值 = com._values_from_object(self).round(decimals)
  • 我顽固地试图过滤掉我的 apply/lambda 中的 NULL 值。没有太多的运气。是否有可能在 apply/lambda 中使用 IF 语句来实现 try/except 做了什么?如何选择不为 NULL 的 DataFrame 单元格值? “如果 val 不是 None”会在 DataFrame 上工作吗?
  • 也许你的系列不是数字:你可以试试df['Distance_AB'] = pd.to_numeric(df.apply(calculator, axis=1), errors='coerce').round()
猜你喜欢
  • 2012-10-13
  • 2015-03-26
  • 2022-01-03
  • 1970-01-01
  • 2015-11-29
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
相关资源
最近更新 更多