【问题标题】:Pandas: Impute NaN's熊猫:估算 NaN
【发布时间】:2014-01-29 18:53:00
【问题描述】:

我有一个不完整的数据框incomplete_df,如下所示。我想用对应的id 的平均amount 估算缺失的amounts。如果特定 id 的平均值本身是 NaN(请参阅 id=4),我想使用整体平均值。

以下是示例数据和我非常低效的解决方案:

import pandas as pd
import numpy as np
incomplete_df = pd.DataFrame({'id': [1,2,3,2,2,3,1,1,1,2,4],
                              'type': ['one', 'one', 'two', 'three', 'two', 'three', 'one', 'two', 'one', 'three','one'],
                         'amount': [345,928,np.NAN,645,113,942,np.NAN,539,np.NAN,814,np.NAN] 
                         }, columns=['id','type','amount'])

# Forrest Gump Solution
for idx in incomplete_df.index[np.isnan(incomplete_df.amount)]: # loop through all rows with amount = NaN
    cur_id = incomplete_df.loc[idx, 'id']
    if (cur_id in means.index ):
        incomplete_df.loc[idx, 'amount'] = means.loc[cur_id]['amount'] # average amount of that specific id.
    else:
        incomplete_df.loc[idx, 'amount'] = np.mean(means.amount) # average amount across all id's

实现这一目标的最快和最 Pythonic/pandonic 的方法是什么?

【问题讨论】:

  • 在 0.13 中您可以这样做:pandas.pydata.org/pandas-docs/dev/… 并查看缺失值部分:pandas.pydata.org/pandas-docs/dev/…
  • @Jeff,谢谢。我所拥有的不是时间序列。因此,从统计学上讲,我正在寻找插补而不是(内/外)插值。如何处理给定 id 的平均值本身为 NaN 的情况?
  • 请参阅下面的@DSM 解决方案作为您想要的概率。但是插值可以在 Frames FYI 上工作;时间序列无关紧要。他们有很多选择。
  • @Jeff 您的部分链接现在是 pandas-docs.github.io/pandas-docs-travis/… 。此外,将 OP 的评论添加到 doc 也会有所帮助:pandas imputation 不仅适用于时间序列,对于非顺序、非时间序列数据,应避免使用“向后”、“向前”等术语(只需说“缺失”) .此外,有用的说法是 pandas 只提供单一插补,而不是多重插补;查看第三方包,如fancyimpute 等。

标签: python pandas nan dataframe mean


【解决方案1】:

免责声明:我对最快的解决方案并不真正感兴趣,但对最平易近人的解决方案并不感兴趣。

在这里,我认为应该是这样的:

>>> df["amount"].fillna(df.groupby("id")["amount"].transform("mean"), inplace=True)
>>> df["amount"].fillna(df["amount"].mean(), inplace=True)

产生

>>> df
    id   type  amount
0    1    one   345.0
1    2    one   928.0
2    3    two   942.0
3    2  three   645.0
4    2    two   113.0
5    3  three   942.0
6    1    one   442.0
7    1    two   539.0
8    1    one   442.0
9    2  three   814.0
10   4    one   615.2

[11 rows x 3 columns]

有很多明显的调整,具体取决于您希望链式插补过程如何进行。

【讨论】:

  • 谢谢 DSM,如果我有占位符,例如0,代替 NaN,最快的方法是将所有 0 替换为 NaN,然后​​按照您的解决方案进行操作吗? (我知道用 0 代替 NaN 是一个愚蠢的想法 - 唉,我必须使用的就是我所拥有的。)
  • 这可能是我会做的。使用 NaN 表示缺失数据在 pandas 中非常深入,因此最简单的本地方法通常需要让您的数据与之对齐。我不知道最快 - 你可以使用 timeit 来比较。无论如何,将 0 替换为 NaN 既是线性的又是矢量化的,因此不会对运行时增加太多。
  • 只是为了确认一下,这是两种选择,不是都需要完成单个操作吗?
猜你喜欢
  • 2018-07-05
  • 2021-12-15
  • 1970-01-01
  • 2019-08-30
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
  • 2018-03-27
  • 2019-02-13
相关资源
最近更新 更多