【发布时间】:2020-09-24 16:52:41
【问题描述】:
我正在处理一个完全由分类特征组成的数据集。
一列只有缺失值:8124 中的 2480 NaN。
我可以根据现有分类值的百分比成功填充 NaN 值:
print(df['stalk-root'].value_counts(normalize=True), '\n')
产量:
b 0.669029
e 0.198441
c 0.098512
r 0.034018
然后我使用这些百分比来填充缺失值:
# https://stackoverflow.com/questions/38934140/fill-missing-values-by-a-ratio-of-other-values-in-pandas
df['stalk-root'] = df['stalk-root'].fillna(pd.Series(np.random.choice(['b', 'e', 'c', 'r'],
p=[0.669029, 0.198441, 0.098512, 0.034018], size=len(df))))
效果很好。
但是,如果我按“类”列分组,我很好奇 df['stalk-root'] 列的 value_counts 是什么样的。
print(df.groupby('class')['stalk-root'].value_counts(normalize=True), '\n')
产量:
e b 0.550459
e 0.247706
c 0.146789
r 0.055046
p b 0.860853
e 0.118738
c 0.020408
这是一个很大的不同。足够大,我现在想将我的 NaN 填充程序修改为第一个 groupby 类,然后按百分比填充,如上。
我以前用数字列和 mean() 做过这个,但不同的是我是手动的 根据 value_counts(normalize=True) 的结果填充 np.random.choice() 中的百分比。
我不知道怎么说:groupby 类,运行 ['stalk-root'].value_counts(normalize=True),然后像我一样将这些值输入 fillna(np.random.choice()上面做了。
我将有两组完全不同的填充值,而“r”只出现在其中一组中。
一个将是(对于“e”类):
np.random.choice(['b', 'e', 'c', 'r'],
p=[0.550459, 0.247706, 0.146789, 0.055046], size=len(df)
另一个(对于“p”类)将是:
np.random.choice(['b', 'e', 'c'],
p=[0.860853, 0.118738, 0.020408], size=len(df)
我遇到的第二个问题是 size=len(df)。这必须是每个分组的大小(我假设),并且它们的大小不同。
【问题讨论】:
-
可以提供样品吗?说
df[['class', 'stalk-root']].head(50).to_dict() -
@RichieV,我必须编辑我的问题以适合您要求的输出。见上文。
-
我正在使用来自 Kaggle 的蘑菇.csv 数据集。
-
那个数据集中没有
NaNs...你下载后修改了吗? -
df.info()数据集中没有空值。RangeIndex: 8124 entries, 0 to 8123& 所有列都有8124 non-null值
标签: python-3.x pandas pandas-groupby