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

时间:2019-12-28 18:03:35

标签: python pandas scikit-learn sklearn-pandas

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

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

我想在熊猫和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

2 个答案:

答案 0 :(得分:4)

您还可以使用以下字典,然后堆叠并填充:

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列(不只是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

答案 1 :(得分:3)

您可以执行以下操作:

  1. 通过Area / Price来获取因素
  2. GroupBy上的Category
  3. NaNffill填充bfill
  4. Price与新因子相乘以创建新的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