如何根据与值的辅助数据帧匹配的条件在主数据帧的列中填充 NaN,以使用多个填充值填充 NaN

我需要根据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.0

1   102     Dog         Housing     6.0

2   103     Horse       Housing     NaN

3   104     Horse       Housing     5.0

4   105     Goat        Housing     3.0

5   106     Dog         Feeding     3.0

6   107     Cat         Feeding     6.0

7   108     Horse       Housing     6.0

8   109     Hamster     Feeding     5.0

9   110     Horse       Feeding     3.0

平均值数据


    Animal_Type Cost_Type   Price

0   Cat         Feeding     4.500000

1   Cat         Housing     5.000000

2   Chicken     Feeding     5.000000

3   Chicken     Housing     4.500000

4   Dog         Feeding     3.000000

5   Dog         Housing     6.000000

6   Goat        Feeding     5.000000

7   Goat        Housing     5.000000

8   Hamster     Feeding     5.250000

9   Hamster     Housing     3.000000

10  Horse       Feeding     3.500000

11  Horse       Housing     5.666667

12  Rabit       Feeding     3.000000

13  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)))


绝地无双
浏览 79回答 1
1回答

ITMISS

我需要根据groupby和mean函数创建的第二个数据帧在主数据框中填充 NA 值。你不需要那一步。您可以通过分组为多个数据帧、对每个单独的数据帧应用均值并仅在该数据帧内填充 NA 值来一步完成此操作。因此,不要创建mean_data数据框,而是执行以下操作:def fill_by_mean(df):    df["Price"] = df["Price"].fillna(df["Price"].mean())    return dfmain_data = main_data.groupby(["Animal_Type", "Cost_Type"]).apply(fill_by_mean)每次单独调用 fill_by_mean() 都会看到一个如下所示的数据帧:    Pet_ID Animal_Type Cost_Type  Price11     112       Rabit   Feeding    NaN34     135       Rabit   Feeding    3.038     139       Rabit   Feeding    3.0然后它获取价格列的平均值并使用它填充 NA 值。然后 Groupby 将所有单独的数据帧重新连接在一起。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python