我需要根据groupby和mean函数创建的第二个数据帧在主数据框中填充 NA 值。我的原始数据框有大约 1.5K NaN 我需要填充,因此这需要大规模重现。我创建了一个假数据框,它是使用假场景对我的数据进行简短、快速和肮脏的模仿。我无法与你分享我的真实数据。我的总体想法是:main_data[ (main_data["Animal_Type"] == mean_data["Animal_Type"]) & (main_data["Cost_Type"] == mean_data["Cost_Type"]) ] = main_data["Price"].fillna(mean_data["Price"])显然,这是行不通的,但这就是我的逻辑如何运作的一般要点。我找到了[他的答案][1],但我无法将其正确应用于我的问题。很多答案都涉及mask或假设我的数据非常小,只有一个值可以替换我的所有 NaN。我的原始数据集中有大约 50 种不同的方法,它们与每个“成本类型”的“动物类型”唯一配对。我的原始数据框大约有 30K 个观察值,其中也充满了独特的观察值。我可以映射,但这仅适用于单个列。我对编码相当陌生,所以很多其他答案对我来说太复杂了,也无法理解和改变。主数据mean_data.head(10) **Pet_ID Animal_Type Cost_Type Price**0 101 Goat Housing 6.01 102 Dog Housing 6.02 103 Horse Housing NaN3 104 Horse Housing 5.04 105 Goat Housing 3.05 106 Dog Feeding 3.06 107 Cat Feeding 6.07 108 Horse Housing 6.08 109 Hamster Feeding 5.09 110 Horse Feeding 3.0平均值数据 Animal_Type Cost_Type Price0 Cat Feeding 4.5000001 Cat Housing 5.0000002 Chicken Feeding 5.0000003 Chicken Housing 4.5000004 Dog Feeding 3.0000005 Dog Housing 6.0000006 Goat Feeding 5.0000007 Goat Housing 5.0000008 Hamster Feeding 5.2500009 Hamster Housing 3.00000010 Horse Feeding 3.50000011 Horse Housing 5.66666712 Rabit Feeding 3.00000013 Rabit Housing 3.000000我的可重现代码:random.seed(10)random.seed(10)main_data = pd.DataFrame(columns = ["Pet_ID", "Animal_Type", "Cost_Type", "Price", "Cost"])main_data["Pet_ID"] = pd.Series(list(range(101,150)))
1 回答
![?](http://img1.sycdn.imooc.com/545865470001bf9402200220-100-100.jpg)
ITMISS
TA贡献1871条经验 获得超8个赞
我需要根据groupby和mean函数创建的第二个数据帧在主数据框中填充 NA 值。
你不需要那一步。您可以通过分组为多个数据帧、对每个单独的数据帧应用均值并仅在该数据帧内填充 NA 值来一步完成此操作。
因此,不要创建mean_data数据框,而是执行以下操作:
def fill_by_mean(df):
df["Price"] = df["Price"].fillna(df["Price"].mean())
return df
main_data = main_data.groupby(["Animal_Type", "Cost_Type"]).apply(fill_by_mean)
每次单独调用 fill_by_mean() 都会看到一个如下所示的数据帧:
Pet_ID Animal_Type Cost_Type Price
11 112 Rabit Feeding NaN
34 135 Rabit Feeding 3.0
38 139 Rabit Feeding 3.0
然后它获取价格列的平均值并使用它填充 NA 值。然后 Groupby 将所有单独的数据帧重新连接在一起。
添加回答
举报
0/150
提交
取消