Python 熊猫-使用多个值填充NaN

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

我有一列,我们称之为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], 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的比率,它可能会扭曲数据。这就是我坚持的原因。但是如果你有什么方法可以帮助我的话,请分享一下!我看你的回答将允许处理更复杂的案件。感谢您为解决方案范围添加新维度。谢谢!这正是我所需要的