为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

绝地无双 2023-10-06 16:30:12
我需要根据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 将所有单独的数据帧重新连接在一起。


查看完整回答
反对 回复 2023-10-06
  • 1 回答
  • 0 关注
  • 78 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信