【问题标题】:Filling missing data by random choosing from non missing values in pandas dataframe通过从熊猫数据框中的非缺失值中随机选择来填充缺失数据
【发布时间】:2016-07-24 14:58:29
【问题描述】:

我有一个熊猫数据框,其中有几个缺失值。我注意到非缺失值彼此接近。因此,我想通过随机选择非缺失值来估算缺失值。

例如:

import pandas as pd
import random
import numpy as np

foo = pd.DataFrame({'A': [2, 3, np.nan, 5, np.nan], 'B':[np.nan, 4, 2, np.nan, 5]})
foo
    A   B
0   2 NaN
1   3   4
2 NaN   2   
3   5 NaN
4 NaN   5

我想例如 foo['A'][2]=2foo['A'][5]=3 我的 pandas DataFrame 的形状是 (6940,154)。 我试试这个

foo['A'] = foo['A'].fillna(random.choice(foo['A'].values.tolist()))

但它不起作用。你能帮我实现吗?最好的问候。

【问题讨论】:

    标签: python pandas missing-data


    【解决方案1】:

    您可以使用pandas.fillna 方法和random.choice 方法通过随机选择特定列来填充缺失值。

    import random
    import numpy as np
    
    df["column"].fillna(lambda x: random.choice(df[df[column] != np.nan]["column"]), inplace =True)
    

    其中 column 是您要随机填充非 nan 值的列。

    【讨论】:

    • 我试试看。但不是用它输入的值来估算<function <lambda> at 0x7fa4eb48b9b0>..
    • 对不起,你能提供一些示例数据吗?
    • 我用示例数据编辑了我的问题。谢谢
    • 我已经资助了答案。我这样做了:foo = foo.apply(lambda x: x.fillna(random.choice(x.dropna())), axis=1)。你的回答给出了线索​​。非常感谢您的帮助。
    • 不用担心。很高兴我能帮上忙 :) 这有点令人困惑。
    【解决方案2】:

    这对我在 Pandas DataFrame 上很有效

    def randomiseMissingData(df2):
        "randomise missing data for DataFrame (within a column)"
        df = df2.copy()
        for col in df.columns:
            data = df[col]
            mask = data.isnull()
            samples = random.choices( data[~mask].values , k = mask.sum() )
            data[mask] = samples
    
    return df
    

    【讨论】:

    • 对于 pandas 数据框,这是一种明智的做法,因为样本数据的统计信息根据定义反映了原始数据的统计信息。通过这种方式,您可以在保持相同统计数据的同时填补空白。
    • 最好使用df.loc[mask, col] = samples 分配以避免警告
    【解决方案3】:

    这是在对第一个答案进行改进后并根据如何检查 numpy int 是否为 nand 在 numpy 文档中找到 here 后解决此问题的另一种方法

    foo['A'].apply(lambda x: np.random.choice([x for x in range(min(foo['A']),max(foo['A'])]) if (np.isnan(x)) else x)
    

    【讨论】:

      【解决方案4】:

      我这样做是为了用随机的非 NaN 值填充 NaN 值:

      import random
      
      df['column'].fillna(random.choice(df['column'][df['column'].notna()]), inplace=True)
      

      【讨论】:

        【解决方案5】:

        这是另一种 Pandas DataFrame 方法

        import numpy as np
        def fill_with_random(df2, column):
            '''Fill `df2`'s column with name `column` with random data based on non-NaN data from `column`'''
            df = df2.copy()
            df[column] = df[column].apply(lambda x: np.random.choice(df[column].dropna().values) if np.isnan(x) else x)
            return df
        

        【讨论】:

          【解决方案6】:

          对我来说只有这个有效,上面的所有例子都失败了。 有些填写相同的数字,有些没有填写任何内容。

          def fill_sample(df, col):
              tmp = df[df[col].notna()[col].sample(len(df[df[col].isna()])).values
              k = 0
              for i,row in df[df[col].isna()].iterrows():
          
                 df.at[i, col] = tmp[k]
                 k+=1
              return df
          

          【讨论】:

          • 请不要嵌入代码作为截图。相反,将其粘贴为文本,并使用 Markdown 将其格式化为代码。这使得阅读、复制和粘贴变得更容易。它还有助于确保它出现在搜索结果中。
          猜你喜欢
          • 1970-01-01
          • 2020-06-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-10
          • 2017-08-21
          • 2019-08-01
          相关资源
          最近更新 更多