我需要根據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 回答

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
提交
取消