熊猫-使用多个值填充NaN

时间:2019-08-21 07:10:07

标签: python pandas dataframe nan missing-data

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

我想在X列中填写NaN值,但我不想对所有NaN条目使用单个值。

例如说:我想用“ 1”填充NaN值的50%,用“ 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值。

视觉效果将是类似的

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

使用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

答案 2 :(得分:0)

使用void main() { RegExp exp = new RegExp(r"(\p{Script:Greek})"); String str = "Γ"; Iterable<RegExpMatch> matches = exp.allMatches(str); for (Match m in matches) { String match = m.group(0); print(match); } } 并填充值

  • slicing columns-函数检测给定系列对象中的缺失值

例如。

isnull()

O / P:

在数据框之前

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