【问题标题】:Can fillna take in a function or just the given methods?fillna 可以接受一个函数还是只接受给定的方法?
【发布时间】:2017-04-17 16:19:33
【问题描述】:

fillna 可以接受一个函数吗?或者只是方法'backfill','bfill'等?

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html

例如,如果数据框没有任何初始数据,则回填方法将毫无用处,不是吗?反之亦然,以防数据帧末尾没有数据。

这就是为什么我想使用适当的方法(如外推法)的一些原因

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    fillna 打算取一个value 来填充,或者使用*{‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}* 中的一种方法

    From the docs you referenced

    标量、字典、序列或数据帧

    用于填充空洞的值(例如 0),或者指定用于每个索引(对于系列)或列(对于数据框)的值的 dict/Series/DataFrame。 (不在 dict/Series/DataFrame 中的值将不会被填充)。此值不能是列表。

    回答

    fillna 没有将函数作为value 参数的有效输入。但是,如果您有一个可以生成系列或数据帧的函数,那么您可以将所需的任何输入传递给函数并将结果传递给fillna


    示例

    value 参数可以采用标量、字典、系列或数据帧。以下是一些外观示例

    考虑数据框df

    df = pd.DataFrame([
            [1, None, 2, None],
            [None, 3, None, 4],
            [5, 6, None, None],
            [None, None, 7, 8]
        ], list('ABCD'), list('WXYZ'))
    
    print(df)
    
         W    X    Y    Z
    A  1.0  NaN  2.0  NaN
    B  NaN  3.0  NaN  4.0
    C  5.0  6.0  NaN  NaN
    D  NaN  NaN  7.0  8.0
    

    用标量填充

    df.fillna(9)
    
         W    X    Y    Z
    A  1.0  9.0  2.0  9.0
    B  9.0  3.0  9.0  4.0
    C  5.0  6.0  9.0  9.0
    D  9.0  9.0  7.0  8.0
    

    用字典填充

    filler = dict(W=-9, X=-10, Y=-11, Z=-12)
    df.fillna(filler)
    
         W     X     Y     Z
    A  1.0 -10.0   2.0 -12.0
    B -9.0   3.0 -11.0   4.0
    C  5.0   6.0 -11.0 -12.0
    D -9.0 -10.0   7.0   8.0
    

    填写系列

    filler = pd.Series(dict(W=-9, X=-10, Y=-11, Z=-12))
    df.fillna(filler)
    
         W     X     Y     Z
    A  1.0 -10.0   2.0 -12.0
    B -9.0   3.0 -11.0   4.0
    C  5.0   6.0 -11.0 -12.0
    D -9.0 -10.0   7.0   8.0
    

    用数据框填充

    filler = pd.DataFrame(-np.arange(df.size).reshape(df.shape), df.index, df.columns)
    print(filler)
    
        W   X   Y   Z
    A   0  -1  -2  -3
    B  -4  -5  -6  -7
    C  -8  -9 -10 -11
    D -12 -13 -14 -15
    
    df.fillna(filler)
    
         W     X     Y     Z
    A  1.0 -10.0   2.0 -12.0
    B -9.0   3.0 -11.0   4.0
    C  5.0   6.0 -11.0 -12.0
    D -9.0 -10.0   7.0   8.0
    

    用索引填充,需要转置
    df.fillna(filler, axis=1)生成NotImplementedError

    filler = dict(A=-9, B=-10, C=-11, D=-12)
    print(df.T.fillna(filler).T)
    
          W     X     Y     Z
    A   1.0  -9.0   2.0  -9.0
    B -10.0   3.0 -10.0   4.0
    C   5.0   6.0 -11.0 -11.0
    D -12.0 -12.0   7.0   8.0
    

    【讨论】:

      【解决方案2】:

      简答:

      不,fillna 不能接受函数,只能接受方法。

      简短的回答:

      有一个df.interpolate 函数允许您使用不同的插值技术来填充。

      长答案:

      您可以参考the answer here,其中有人概述了一种使用 scipy 推断数据的方法。不幸的是,没有原生的 pandas 函数来实现这一点):

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-04
        • 2023-03-23
        • 2013-07-29
        • 2017-03-27
        相关资源
        最近更新 更多