通过从 pandas 和 scikit-learn 中的非缺失值估计方程来估算缺失值

Posted

技术标签:

【中文标题】通过从 pandas 和 scikit-learn 中的非缺失值估计方程来估算缺失值【英文标题】:Impute missing value by estimating the equation from non missing value in pandas and scikit-learn 【发布时间】:2020-04-18 04:15:45 【问题描述】:

我有一个如下图所示的数据框

Price        Category      Area
20           Red           100
30           Red           150
10           Red           50
25           Red           NaN
30           Red           NaN
10           Green         30
20           Green         60
30           Green         90
10           Green         30
40           Green         NaN
50           Green         NaN

根据以上,我想分别估算红色和绿色每个类别的面积和价格之间的关系。

例如这里的红色:

Area = 5 * Price

同样适用于格林:

Area = 3 * Price

我想在 pandas 和 scikit-learn 中实现它:

步骤 1. 估计每个类别的面积和价格之间的关系。 2. 根据关系估算缺失值。

我是 python 和编码方面的新手。

Expected output
Price        Category      Area
20           Red           100
30           Red           150
10           Red           50
25           Red           125
30           Red           150
10           Green         30
20           Green         60
30           Green         90
10           Green         30
40           Green         120
50           Green         150

【问题讨论】:

如何保存红色和绿色的因子? @anky_91 不太清楚,其实我也不怎么通过编码来解决这个问题。。我们可以过滤每个类别的数据框并估计因子吗。 【参考方案1】:

你可以这样做:

    使用Area / Price 获取因子 GroupByCategoryffillbfill 填充NaNPrice 与新因子相乘以创建新的Area
df['factors'] = df['Area'] / df['Price']
df['factors'] = df.groupby('Category', sort=False)['factors'].ffill().bfill()

df = df.assign(Area=df['Price'] * df['factors']).drop(columns='factors')
    Price Category  Area
0      20      Red 100.0
1      30      Red 150.0
2      10      Red  50.0
3      25      Red 125.0
4      30      Red 150.0
5      10    Green  30.0
6      20    Green  60.0
7      30    Green  90.0
8      10    Green  30.0
9      40    Green 120.0
10     50    Green 150.0

【讨论】:

【参考方案2】:

你也可以使用下面的字典,然后堆叠填充:

d='Area_Red' : 5 * df['Price'] , 'Area_Green' : 3 * df['Price']
df_ref=pd.DataFrame(d).rename(columns=lambda x: x.split('_')[1]).stack()
df['Area']=df.set_index('Category',append=True)['Area'].fillna(df_ref).droplevel(1)

如果您只想根据df_ref 获取值并更新Area col(不仅仅是fillna),请将最后一行更改为下面,使用df.lookup

d='Area_Red' : 5 * df['Price'] , 'Area_Green' : 3 * df['Price']
df_ref=pd.DataFrame(d).rename(columns=lambda x: x.split('_')[1]) #without stack
df['Area']=df_ref.lookup(df['Category'].index,df['Category']) 

print(df)

    Price Category  Area
0      20      Red   100
1      30      Red   150
2      10      Red    50
3      25      Red   125
4      30      Red   150
5      10    Green    30
6      20    Green    60
7      30    Green    90
8      10    Green    30
9      40    Green   120
10     50    Green   150

【讨论】:

@anky_91 是否可以估计非缺失值中的回归系数。

以上是关于通过从 pandas 和 scikit-learn 中的非缺失值估计方程来估算缺失值的主要内容,如果未能解决你的问题,请参考以下文章

通过从每一行的不同列中选择一个元素,从 Pandas DataFrame 创建一个系列

通过从多个列中删除匹配的电子邮件域来过滤 Pandas 数据框

我想通过从 json 获取经度和纬度在谷歌地图上显示标记

如何通过从结果中减去数字来计算嵌套关系和附加字段

通过从 sql server 加入表来更新访问表

如何通过从另一个下拉列表中选择值来填充下拉列表?