Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据频率,使用列中的随机值填充DataFrame的NaN值_Python_Python 3.x_Pandas_Fillna - Fatal编程技术网

Python 根据频率,使用列中的随机值填充DataFrame的NaN值

Python 根据频率,使用列中的随机值填充DataFrame的NaN值,python,python-3.x,pandas,fillna,Python,Python 3.x,Pandas,Fillna,我试图用每一列的随机数据填充熊猫数据框NAN,随机数据根据其频率出现在每一列中。我有这个: def MissingRandom(dataframe): import random dataframe = dataframe.apply(lambda x: x.fillna( random.choices(x.value_counts().keys(), weights =

我试图用每一列的随机数据填充熊猫数据框NAN,随机数据根据其频率出现在每一列中。我有这个:

def MissingRandom(dataframe):
        import random
        dataframe = dataframe.apply(lambda x: x.fillna(
                random.choices(x.value_counts().keys(),
                               weights = list(x.value_counts()))[0]))
    return dataframe
我用随机数据填充数据框,但是对于列中所有缺失的数据,它的数据都是相同的。我希望该列的每一处缺失的数据都有所不同,但我无法做到这一点。有人能帮我吗


非常感谢

请参见下面我的解决方案。首先,我创建了一个函数,该函数根据您的标准(频率作为随机函数中的权重)填充系列,最后,我们将该函数应用于数据帧的所有束:

from collections import Counter
def fillcolumn(ser):
        cna=len(ser[ser.isna()])
        l=ser[ser.notna()]
        d=Counter(l)    
        m=random.choices(list(d.keys()), weights = list(d.values()), k=cna)
        ser[ser.isna()]=m
        return ser
    
for i in df.columns:
    df[i]=fillcolumn(df[i])
您的完整代码:

def MissingRandom(dataframe):
    import random
    from collections import Counter
    def fillcolumn(ser):
        cna=len(ser[ser.isna()])
        l=ser[ser.notna()]
        d=Counter(l)    
        m=random.choices(list(d.keys()), weights = list(d.values()), k=cna)
        ser[ser.isna()]=m
        return ser
        
    for i in dataframe.columns:
        dataframe[i]=fillcolumn(dataframe[i])
    return dataframe

以下是关于这个(有趣的!)主题的两个想法

  • 创建替换函数并调用
    apply
  • 使用
    fillna(方法='ffill')
替换功能: 设置:

df = pd.DataFrame({'a': [1, np.nan, 3, 4, np.nan],
                   'b': [np.nan, 12, np.nan, np.nan, 15],
                   'c': [21, np.nan, np.nan, 24, 25],
                   'd': [31, np.nan, np.nan, 34, 34]})
示例函数:

def replace_na(x):
    """Replace NaN values with values randomly selected from the Series."""
    vc = x.value_counts()
    r = random.choices(vc.keys(), weights=vc.values, k=x.isnull().sum())
    x[x.isnull()] = r
    return x
适用于:

df.apply(lambda x: replace_na(x))
输出:

     a     b     c     d
0  1.0  12.0  21.0  31.0
1  4.0  12.0  25.0  34.0
2  3.0  15.0  21.0  34.0
3  4.0  15.0  24.0  34.0
4  1.0  15.0  25.0  34.0
另一种想法: 一个不同的思维过程。。。因为解决问题就是从不同的角度看问题

我承认,这种方法不符合OP的具体要求,但可能符合基本意图

如果使用列中的随机值填充
NaN
值,则向前填充空值可能更简单(同样有效)。这还可以解决频率问题,因为与不太常见的值相比,更常见的值后面可能会出现缺失值

df.fillna(method='ffill')

如果使用列中的随机值填充
NaN
值,使用
df.fillna(method='ffill')
向前填充任何空值不是更简单(也同样有效)吗?这还可以解决频率问题,因为与非公共值相比,更常见的值后面可能会有一个缺失的值。非常感谢你!不客气,很乐意帮忙:)