【问题标题】:Fill missing values in a data frame with the nearest row用最近的行填充数据框中的缺失值
【发布时间】:2017-12-07 22:28:57
【问题描述】:

我有以下数据框:

df = pd.DataFrame({'id': {3002: 10001,
  3003: 10002,
  3004: 10003,
  3005: 10004,
  3006: 10005,
  3007: 10006,
  3008: 10007,
  3009: 10008,
  3010: 10009,
  3011: 10010,
  3012: 10011,
  3013: 10012,
  3014: 10013,
  3015: 10014,
  3016: 10015,
  3017: 10016,
  3018: 10017,
  3019: 10018,
  3020: 10019,
  3021: 10020},
 'value': {3002: 1669.0,
  3003: 1264.0,
  3004: nan,
  3005: 1411.0,
  3006: 1224.0,
  3007: 1316.0,
  3008: 1736.0,
  3009: nan,
  3010: 1276.0,
  3011: nan,
  3012: nan,
  3013: nan,
  3014: nan,
  3015: 1790.0,
  3016: nan,
  3017: nan,
  3018: nan,
  3019: 1726.0,
  3020: nan,
  3021: nan}})

我想用最近的 id 中的一个来填充缺失的值,如果两个值的距离相同,那么我想使用平均值。

例如

id 10008 是 NaN,那么我想用 10009 和 10007 的平均值填充单元格:(1736.0 + 1276.0)/2

对于 id 10015,最接近的值是 10014,所以我将直接使用该值:1790.0

我怎样才能有效地做到这一点?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    这有点棘手,但你可以使用interpolate()(只能在Series上使用):

    df['value'] = df['value'].interpolate(method='slinear').interpolate(method='linear')
    

    第二次插值只需要填充系列中的最后一个 NaN。

    【讨论】:

    • 对,这是为什么呢?
    • 为什么需要第二次插值? 'slinear' 需要一个起点和一个终点来填充两者之间的缺失值。
    【解决方案2】:
    df.value = df.value.interpolate(method='nearest')
    

    【讨论】:

    • 我没有看到你的答案,但“最近”方法并没有给你一个平均值。
    猜你喜欢
    • 1970-01-01
    • 2019-11-18
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    相关资源
    最近更新 更多