【问题标题】:How to define your own fill method parameter in pandas (python)?如何在熊猫(python)中定义自己的填充方法参数?
【发布时间】:2017-03-31 20:57:21
【问题描述】:

一些 DataFrame 和 Series 方法有 method 参数。例如:

DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)

并且方法参数可以取以下值:{None, 'backfill'/'bfill', 'pad'/'ffill', 'nearest'}

但是我想 def 某种填充功能,它反过来定义如何使用系列中已经存在的值来填充空白,以便它可以通过以下方式使用:

df = DataFrame.fillna(method='new_method')

【问题讨论】:

  • 你能具体说明你想要什么吗?据我了解,听起来您需要对fillna 方法进行猴子修补,或修改源代码,因为method 参数不接受任意函数。
  • @juanpa.arrivillaga 是的,我认为正确的方法是修改源代码。好吧,例如我想要一个函数,它可以用系列中最接近的值的平均值来填补空白。我的意思是这样的:1 NaN 3 --> 1 2 3。
  • 是否有某些原因必须能够将它与fillna 方法一起使用?编写自己的函数并保留源代码可能会更好。
  • @juanpa.arrivillaga 不是真的。但我认为可以将它与所有其他方法一起使用......比如重新索引等。你为什么这么认为?据我所知,当您想要定义一些自定义操作时,修改源代码是一种常见的做法。
  • 在不了解所有后果的情况下更改复杂库的代码通常不是一个好主意。当然你可以尝试,但可能是作为最后的手段,或者当你想真正开始为 pandas 做出贡献时。

标签: python pandas numpy


【解决方案1】:

在您非常具体的情况下(最接近值的平均值),您可以这样做:

import pandas as pd
import numpy as np

col1 = np.array([0, 1, np.nan, 4])
col2 = np.array([0, np.nan, 2, 5])

df = pd.DataFrame({"col1" : col1, "col2" : col2})

# Trick: average forward and backward fill
df = 0.5 * (df.fillna(method="bfill") + df.fillna(method="ffill"))

通过平均后向和前向填充,您将获得平均值,同时保持所有其他值(但舍入误差除外)不变。但它当然不适用于第一行和最后一行。 (但如果可以接受的话,你可以再次使用 ffill 和 bfill)

【讨论】:

  • 事实上,这更像是一个好奇的问题。我只是想知道是否可以重新定义,例如,something 以使我能够设置自定义方法参数。我知道,几乎总是可以找到解决问题的方法。
猜你喜欢
  • 1970-01-01
  • 2018-08-03
  • 1970-01-01
  • 2020-11-08
  • 2020-11-30
  • 2020-08-31
  • 2021-09-26
  • 2020-11-06
  • 2019-10-05
相关资源
最近更新 更多