繁体   English   中英

Pandas - 使用多个值填充 NaN

[英]Pandas - Fill NaN using multiple values

我有一列(我们称之为列 X)包含大约 16000 个 NaN 值。 该列有两个可能的值,1 或 0(就像二进制)

我想填充 X 列中的 NaN 值,但我不想为所有 NaN 条目使用单个值。

比如说; 我想用“1”填充 50% 的 NaN 值,用“0”填充另外 50%。

我已经阅读了“ 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

处理 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

您可以使用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
'''

使用pandas.Series.sample

mask = df['Column_x'].isna() 
ind = df['Column_x'].loc[mask].sample(frac=0.5).index
df.loc[ind, 'Column_x'] = 1
df['Column_x'] = df['Column_x'].fillna(0)
print(df)

输出:

    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

使用slicing columns和填充值

  • isnull() - 函数检测给定系列对象中的缺失值

前任。

import pandas as pd

df = pd.DataFrame({'Column_y': pd.Series(range(9), index=['a', 'b', 'c','d','e','f','g','h','i']),
                   'Column_x': pd.Series(range(1), index=['a'])})

print(df)
# get list of index series which have NaN Column_x value
idx = df['Column_x'].index[df['Column_x'].isnull()]
total_nan_len = len(idx)
first_nan = total_nan_len//2
# fill first 50% of 1
df.loc[idx[0:first_nan], 'Column_x'] = 1
# fill last 50% of 0
df.loc[idx[first_nan:total_nan_len], 'Column_x'] = 0
print(df)

开/关:

数据框之前

   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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM