【问题标题】:Easier way to fill the missing fields csv using python Pandas使用 python Pandas 填充缺失字段 csv 的更简单方法
【发布时间】:2021-10-28 18:47:41
【问题描述】:

我使用了 pandas 中的 groupby 方法,该方法可以在这个示例 csv 中按 id 和时间分组:

| id | month | average tree growth (cm)|
|----|-------|-------------------------|
|  1 |   4   |        9                |
|  1 |   5   |        4                |
|  1 |   6   |        7                |
|  2 |   1   |        9                |
|  2 |   2   |        9                |
|  2 |   3   |        8                |
|  2 |   4   |        6                |

但是,每个 id 应该有 12 个月,我需要将缺失月份的平均树高填写为空值,如下所示:

| id | month | average tree growth (cm)|
|----|-------|-------------------------|
|  1 |   1   |        nan              |
|  1 |   2   |        nan              |
|  1 |   3   |        nan              |
|  1 |   4   |        9                |
|  1 |   5   |        4                |
|  1 |   6   |        7                |
|  1 |   7   |        nan              |
|  1 |   8   |        nan              |
|  1 |   9   |        nan              |
|  1 |   10  |        nan              |
|  1 |   11  |        nan              |
|  1 |   12  |        nan              |
|  2 |   1   |        9                |

这是用于散景绘图的目的,在这种情况下,如何使用 python 将缺少的月份添加到每个 id 并将平均高度填充到 nan? 有没有比蛮力循环所有 id 并检查几个月更简单的方法? 任何提示将不胜感激!

【问题讨论】:

    标签: python pandas csv


    【解决方案1】:

    一种方法是创建MultiIndex 并使用pd.MultiIndex.from_product.reindex() 重新索引,如下所示:

    mux = pd.MultiIndex.from_product([df['id'].unique(), np.arange(1, 13)],
                                     names=['id', 'month'])
    
    df.set_index(['id', 'month']).reindex(mux).reset_index()
    

    结果:

        id  month  average tree growth (cm)
    0    1      1                       NaN
    1    1      2                       NaN
    2    1      3                       NaN
    3    1      4                       9.0
    4    1      5                       4.0
    5    1      6                       7.0
    6    1      7                       NaN
    7    1      8                       NaN
    8    1      9                       NaN
    9    1     10                       NaN
    10   1     11                       NaN
    11   1     12                       NaN
    12   2      1                       9.0
    13   2      2                       9.0
    14   2      3                       8.0
    15   2      4                       6.0
    16   2      5                       NaN
    17   2      6                       NaN
    18   2      7                       NaN
    19   2      8                       NaN
    20   2      9                       NaN
    21   2     10                       NaN
    22   2     11                       NaN
    23   2     12                       NaN
    

    【讨论】:

    • 非常感谢!但是你知道为什么会出现这个错误吗? “系列”对象没有属性“堆栈”。按 id 和月份对数据进行分组后,我创建了一个新的 csv。当我阅读这个新的 csv 并应用您提供的方法时,它会引发上述错误。
    • @YangZiqi 以上2个你试过哪一个?你有没有像上面那样在 stack 之前使用 unstack ?
    • @YangZiqi 虽然我不明白您使用我的解决方案为什么会出现错误(我用您的示例数据测试它没有问题),但我在上面的编辑中提供了另一个解决方案。该解决方案应该运行得非常快,因为它只涉及重新索引行索引的简单步骤,而无需对数据帧进行分组或重新格式化的多个步骤。看看吧。
    • 谢谢,您的解决方案对我来说看起来很合理。我想我在使用你的方法时弄乱了我阅读的 csv。它现在起作用了。非常感谢!
    • @YangZiqi 太好了,它现在对你有用。充分利用我更新的解决方案。正如我所提到的,该解决方案可以直接完成此特定任务,而无需对数据框进行不必要的分组或重新格式化。因此,它更有效。
    【解决方案2】:

    一种可能的解决方案如下:

    (df.groupby('id')['month']
       .apply(lambda x:np.arange(1, 13))
       .explode()
       .reset_index()
       .merge(df, how='left')
       
    )
    
    

    产生:

    id month  average tree growth (cm)
    0    1     1                       NaN
    1    1     2                       NaN
    2    1     3                       NaN
    3    1     4                       9.0
    4    1     5                       4.0
    5    1     6                       7.0
    6    1     7                       NaN
    7    1     8                       NaN
    8    1     9                       NaN
    9    1    10                       NaN
    10   1    11                       NaN
    11   1    12                       NaN
    12   2     1                       9.0
    13   2     2                       9.0
    14   2     3                       8.0
    15   2     4                       6.0
    16   2     5                       NaN
    17   2     6                       NaN
    18   2     7                       NaN
    19   2     8                       NaN
    20   2     9                       NaN
    21   2    10                       NaN
    22   2    11                       NaN
    23   2    12                       NaN
    ​
    

    【讨论】:

    • 非常感谢!这个对我有用
    • 不要忘记将您接受的答案标记为已接受。我们从未回答的问题列表中消失。
    猜你喜欢
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 2014-03-21
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多