我有一个包含约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
答案 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