Python 熊猫-使用多个值填充NaN
我有一列,我们称之为X列,包含16000个NaN值。该列有两个可能的值,1或0,类似于二进制 我想填写X列中的NaN值,但我不想对所有NaN条目使用单个值 比如说,;我想用“1”填充50%的NaN值,用“0”填充其他50%的NaN值 我已经阅读了“fillna”文档,但没有找到任何能够满足此功能的相关信息 我真的不知道如何在这个问题上取得进展,所以我什么都没试过Python 熊猫-使用多个值填充NaN,python,pandas,dataframe,nan,missing-data,Python,Pandas,Dataframe,Nan,Missing Data,我有一列,我们称之为X列,包含16000个NaN值。该列有两个可能的值,1或0,类似于二进制 我想填写X列中的NaN值,但我不想对所有NaN条目使用单个值 比如说,;我想用“1”填充50%的NaN值,用“0”填充其他50%的NaN值 我已经阅读了“fillna”文档,但没有找到任何能够满足此功能的相关信息 我真的不知道如何在这个问题上取得进展,所以我什么都没试过 df['Column_x'] = df['Column_x'].fillna(df['Column_x'].mode()[0], in
df['Column_x'] = df['Column_x'].fillna(df['Column_x'].mode()[0], inplace= True)
但这会用列的模式填充数据帧'df'的X列中的所有NaN值,我想用一个值填充50%,用另一个值填充50%
因为我还没有尝试过任何东西,所以我无法展示或描述任何实际结果
我能说的是,预期的结果是x列的8000个NaN值替换为“1”,另8000个替换为“0”
一个视觉效果会是这样的
在处理NaN之前
Index Column_x
0 0.0
1 0.0
2 0.0
3 0.0
4 0.0
5 0.0
6 1.0
7 1.0
8 1.0
9 1.0
10 1.0
11 1.0
12 NaN
13 NaN
14 NaN
15 NaN
16 NaN
17 NaN
18 NaN
19 NaN
Index Column_x
0 0.0
1 0.0
2 0.0
3 0.0
4 0.0
5 0.0
6 1.0
7 1.0
8 1.0
9 1.0
10 1.0
11 1.0
12 0.0
13 0.0
14 0.0
15 0.0
16 1.0
17 1.0
18 1.0
19 1.0
在处理完NaN之后
Index Column_x
0 0.0
1 0.0
2 0.0
3 0.0
4 0.0
5 0.0
6 1.0
7 1.0
8 1.0
9 1.0
10 1.0
11 1.0
12 NaN
13 NaN
14 NaN
15 NaN
16 NaN
17 NaN
18 NaN
19 NaN
Index Column_x
0 0.0
1 0.0
2 0.0
3 0.0
4 0.0
5 0.0
6 1.0
7 1.0
8 1.0
9 1.0
10 1.0
11 1.0
12 0.0
13 0.0
14 0.0
15 0.0
16 1.0
17 1.0
18 1.0
19 1.0
使用pandas.Series.sample:
输出:
Index Column_x
0 0 0.0
1 1 0.0
2 2 0.0
3 3 0.0
4 4 0.0
5 5 0.0
6 6 1.0
7 7 1.0
8 8 1.0
9 9 1.0
10 10 1.0
11 11 1.0
12 12 1.0
13 13 0.0
14 14 1.0
15 15 0.0
16 16 0.0
17 17 1.0
18 18 1.0
19 19 0.0
可以将random.choices与其权重参数一起使用,以确保分布保持不变。我在这里用numpy模拟了一个NaN列,得到了所需替换的确切长度。这种方法也可用于具有两个以上类和更复杂分布的列
import pandas as pd
import numpy as np
import random
df = pd.DataFrame({'col1': range(16000)})
df['col2'] = np.nan
nans = df['col2'].isna()
length = sum(nans)
replacement = random.choices([0, 1], weights=[.5, .5], k=length)
df.loc[nans,'col2'] = replacement
print(df.describe())
'''
Out:
col1 col2
count 16000.000000 16000.000000
mean 7999.500000 0.507625
std 4618.946489 0.499957
min 0.000000 0.000000
25% 3999.750000 0.000000
50% 7999.500000 1.000000
75% 11999.250000 1.000000
max 15999.000000 1.000000
'''
使用切片列和填充值
isnull-函数检测给定序列对象中缺少的值
前
O/p:
数据帧之前
Column_y Column_x
a 0 0.0
b 1 NaN
c 2 NaN
d 3 NaN
e 4 NaN
f 5 NaN
g 6 NaN
h 7 NaN
i 8 NaN
Column_y Column_x
a 0 0.0
b 1 1.0
c 2 1.0
d 3 1.0
e 4 1.0
f 5 0.0
g 6 0.0
h 7 0.0
i 8 0.0
数据帧之后
Column_y Column_x
a 0 0.0
b 1 NaN
c 2 NaN
d 3 NaN
e 4 NaN
f 5 NaN
g 6 NaN
h 7 NaN
i 8 NaN
Column_y Column_x
a 0 0.0
b 1 1.0
c 2 1.0
d 3 1.0
e 4 1.0
f 5 0.0
g 6 0.0
h 7 0.0
i 8 0.0
是否有关于是否应填写0或1的规则?如果是随机的,您可以尝试用0到1之间的随机浮点数填充NaN值,然后对其进行四舍五入。NaN值必须精确或尽可能接近50-50%的1s和0s吗?@Carsten它必须是0或1,因为我正在处理只能有1或0的列中缺少的数据。50-50的比率对于保持列的平衡非常重要。数据可能会在不遵守比率的情况下发生倾斜。你能告诉我如何用随机方式填充NaN,就像你说的吗?@Chris如果我在填充NaN时改变50-50的比率,它可能会扭曲数据。这就是我坚持的原因。但是如果你有什么方法可以帮助我的话,请分享一下!我看你的回答将允许处理更复杂的案件。感谢您为解决方案范围添加新维度。谢谢!这正是我所需要的