我有一个如下所示的数据框
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
答案 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)
您可以执行以下操作:
Area / Price
来获取因素GroupBy
上的Category
NaN
和ffill
填充bfill
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