我们被要求基于以下假设在数据框的某列(例如df ['A'])中填充缺失值: 1-如果同一行的df ['B']的值大于1000,则使用0。 2-否则,请使用df ['A']
的平均值我使用了以下代码,效果很好。
mean_value = df['A'].mean()
df['A'].loc[(df['A'].isna()) & (df['B] > 1000)] = 0
df['A'].fillna(mean_value, inplace = True)
但是您会看到两行代码用于填充空值。有什么方法可以只用一行替换吗?
答案 0 :(得分:1)
也许您可以使用此
check1 = df['A'].isna()
check2 = (df['A'].isna()) & (df['B'] > 1000)
df['A'] = np.where(check1 , np.where(check2,2000,df['A'].mean()), df['A'])
示例输入
A B
0 5.0 500
1 NaN 2000
2 3.0 1500
3 4.0 1100
4 NaN 7
示例输出
A B
0 5.0 500
1 2000.0 2000
2 3.0 1500
3 4.0 1100
4 4.0 7
答案 1 :(得分:1)
您可以检查np.select
con1=(df['A'].isna()) & (df['B'] > 1000)
con2=df['A'].isna()
df['A']=np.select([con1,con2],[0,df['A'].mean()],default=df.A)
答案 2 :(得分:1)
您可以尝试这种算术方式,尽管在这种情况下只有一线很难阅读。由于您将问题从2000
修改为0
,因此无需添加。所以,答案是
df['A'] = df.A.fillna((df['B'] <= 1000) * df.A.mean())
答案 3 :(得分:0)
我使用了以下代码行,并且可以正常工作,但我仍然相信应该有一种更为温和的方式来解决此问题。
df['A'] = df.apply(lambda x: x['A'] if not(np.isnan(x['A'])) else (0 if x['B'] > 1000 else mean_value), axis = 1)
有什么主意吗?