代码之家  ›  专栏  ›  技术社区  ›  shockwave

Python使用选定列的行值平均值填充

  •  0
  • shockwave  · 技术社区  · 5 年前

    在下表中,我只需要为Week列填写na。NaN应填写该行所有周的平均值。

    +----+---------+------+-------+-------+-------+-------+
    | ID | Feature | Paid | Week1 | Week2 | Week3 | Week4 |
    +----+---------+------+-------+-------+-------+-------+
    | 1  | 1       | 1    | 12    | NaN   | NaN   | NaN   |   
    +----+---------+------+-------+-------+-------+-------+
    | 2  | 0       | 1    | 34    | 23    | NaN   | NaN   |
    +----+---------+------+-------+-------+-------+-------+
    | 3  | 1       | 0    | 24    | 13    | 14    | NaN   |
    +----+---------+------+-------+-------+-------+-------+
    

    代码

    df.fillna(df[[Week1,Week2,Week3,Week4]].mean(axis=1),axis=1,inplace=True)
    

    这是一个错误的说法 NotImplementedError: Currently only can fill with dict/Series column by column

    6 回复  |  直到 5 年前
        1
  •  1
  •   Anurag Dabas    5 年前

    你可以试试via filter() 选择名为“Week”的列,然后找到mean并将其存储到一个变量中(为了获得良好的性能),最后填充 NaN's 利用 fillna()

    cols=df.filter(regex='Week').columns
    m=df[cols].mean(axis=1).round()
    df=df.fillna({x:m for x in cols})
    

    输出:

        ID  Feature Paid    Week1       Week2   Week3   Week4
    0   1       1       1       12      12.0    12.0    12.0
    1   2       0       1       34      23.0    28.0    28.0
    2   3       1       0       24      13.0    14.0    17.0
    
        2
  •  2
  •   Shubham Sharma mkln    5 年前

    创建一个映射 Week mean 每周的价值 axis=1 NaN 使用此字典的值

    c = df.filter(like='Week').columns
    df.fillna(dict.fromkeys(c, df[c].mean(1)))
    

       ID  Feature  Paid  Week1  Week2  Week3  Week4
    0   1        1     1     12   12.0   12.0   12.0
    1   2        0     1     34   23.0   28.5   28.5
    2   3        1     0     24   13.0   14.0   17.0
    
        3
  •  1
  •   I'mahdi    5 年前

    SimpleImputer 从…起 scikit-learn strategy='mean' strategy='most_frequent' 而且使用起来很容易。 (doc)

    import numpy as np
    from sklearn.impute import SimpleImputer
    df = pd.DataFrame({"A": [1, 2, np.NaN, 1, 2], "B": [1,2, 3, 4, 5], "C":[np.NaN, 3, 4, np.NaN, 5]})
    
    imp = SimpleImputer(missing_values=np.nan, strategy='mean')
    imp.fit(df)
    print(imp.transform(df))
    

    输出:

    [[1.  1.  4. ]
     [2.  2.  3. ]
     [1.5 3.  4. ]
     [1.  4.  4. ]
     [2.  5.  5. ]]
    

    例如 你有:

    import numpy as np
    from sklearn.impute import SimpleImputer
    df = pd.DataFrame({"A": [1, 2, np.NaN, 1, 2], "B": [1,2, 3, 4, 5], "C":[np.NaN, 3, 4, np.NaN, 5]})
    
    imp = SimpleImputer(missing_values=np.nan, strategy='most_frequent')
    imp.fit(df)
    print(imp.transform(df))
    

    输出:

    [[1. 1. 3.]
     [2. 2. 3.]
     [1. 3. 4.]
     [1. 4. 3.]
     [2. 5. 5.]]
    
        4
  •  1
  •   BENY    5 年前

    差不多

    cols=['Week1','Week2','Week3','Week4']
    df[cols] = df[cols].fillna(0) + df[cols].isna().mul(df[cols].mean(axis=1),axis=0)
    df
    Out[87]: 
       ID  Feature  Paid  Week1  Week2  Week3  Week4
    0   1        1     1   12.0   12.0   12.0   12.0
    1   2        0     1   34.0   23.0   28.5   28.5
    2   3        1     0   24.0   13.0   14.0   17.0
    
        5
  •  0
  •   Tom Ron    5 年前

    df = pd.DataFrame({"A": [1, 2, np.NaN, 1, 2], "B": [1,2, 3, 4, 5], "C":[np.NaN, 3, 4, np.NaN, 5]})
    cols=["A", "C"]
    df[cols] = df[cols].fillna(df[cols].mean())
         A  B    C
    0  1.0  1  4.0
    1  2.0  2  3.0
    2  1.5  3  4.0
    3  1.0  4  4.0
    4  2.0  5  5.0
    
        6
  •  0
  •   mozway    5 年前

    克服此错误的一种简单方法是在填充Nas之前/之后进行转置:

    df.T.fillna(df.filter(like='Week').mean(axis=1)).T.astype(int)
    

       ID  Feature  Paid  Week1  Week2  Week3  Week4
    0   1        1     1     12     12     12     12
    1   2        0     1     34     23     28     28
    2   3        1     0     24     13     14     17