通过对连续变量进行分组来替换分类变量的 NaN
Posted
技术标签:
【中文标题】通过对连续变量进行分组来替换分类变量的 NaN【英文标题】:Replace NaNs of a categorical variable by grouping them with respect to continuous variable 【发布时间】:2021-09-26 06:10:05 【问题描述】:我在根据“温度”对“天气条件”进行分组时遇到问题,因为它是一个连续变量。所以,我需要通过将“温度”转换为int64
,然后替换“Weather cond
”的 (by mode) NaN 来对它进行分组。但它不应该将原始的“温度”转换为int64
。
Df 是:
temperature weather cond
0 25.6 Cloudy
1 28.7 Sunny
2 26.9 NaN
3 25.9 Cloudy
4 29.9 Cloudy
5 28.1 Overcast
6 34.7 Sunny
7 29.6 NaN
8 26.6 NaN
9 20.5 NaN
解释:
如果我们考虑温度 28.7 和 28.1,这些值应转换为 28(不在原始 df 中),然后用代表这些温度的“天气条件”模式填充 NaN。
注意:即使是近似值(地板/天花板)也可以接受,即将 28.7 视为 29,将 28.1 视为 28。
【问题讨论】:
Sunny 有 1 34 和 1 28。在这种情况下,您如何确定模式。 另外你是什么意思替换模式?模式是'Cloudy' -> 25, 'Overcast' -> 28, 'Sunny' -> 28/34
但缺失值是26,29,26,20
那么映射是如何发生的呢?
@HenryEcker 我在这里使用模式,因为天气条件对于特定温度不是固定的,它可能会有所不同。
@HenryEcker 如果某些天气条件没有任何温度,您可以使用更接近的温度来处理。
所以你想用温度模式的值填充天气条件的NaN?
【参考方案1】:
自合并与merge_asof
import io
df = pd.read_csv(io.StringIO("""temperature weather cond
0 25.6 Cloudy
1 28.7 Sunny
2 26.9 NaN
3 25.9 Cloudy
4 29.9 Cloudy
5 28.1 Overcast
6 34.7 Sunny
7 29.6 NaN
8 26.6 NaN
9 20.5 NaN"""), sep="\s\s+", engine="python")
pd.merge_asof(df.sort_values("temperature"),
df.loc[~df["weather cond"].isna()].sort_values("temperature"),
on="temperature",
direction="nearest")
temperature | weather cond_x | weather cond_y | |
---|---|---|---|
0 | 20.5 | nan | Cloudy |
1 | 25.6 | Cloudy | Cloudy |
2 | 25.9 | Cloudy | Cloudy |
3 | 26.6 | nan | Cloudy |
4 | 26.9 | nan | Cloudy |
5 | 28.1 | Overcast | Overcast |
6 | 28.7 | Sunny | Sunny |
7 | 29.6 | nan | Cloudy |
8 | 29.9 | Cloudy | Cloudy |
9 | 34.7 | Sunny | Sunny |
【讨论】:
以上是关于通过对连续变量进行分组来替换分类变量的 NaN的主要内容,如果未能解决你的问题,请参考以下文章
R语言使用ggplot2包的快速可视化函数qplot绘制散点图(分类变量分组配色连续值程度配色)实战
pandas使用groupby函数基于指定分组变量对dataframe数据进行分组使用get_group函数获取指定分组变量的具体分类值下的所有样本使用sum函数分组中指定数值变量的聚合加和值