Python 根据频率,使用列中的随机值填充DataFrame的NaN值
我试图用每一列的随机数据填充熊猫数据框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 =
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')
向前填充任何空值不是更简单(也同样有效)吗?这还可以解决频率问题,因为与非公共值相比,更常见的值后面可能会有一个缺失的值。非常感谢你!不客气,很乐意帮忙:)