【问题标题】:Filling missing gap with "NAN"用“NAN”填补空白
【发布时间】:2017-02-21 22:07:46
【问题描述】:

我有几年的数据集,但缺少一些值。我想用“NAN”填充这些行 这是一个示例数据:

year    month   day min
2011    1   1   -2.3
2011    1   2   -9.1
2011    1   3   -4.7
2011    1   4   -3.5
2011    1   6   -1.4
2011    1   7   0.1
2011    1   9   -6.3
2011    1   10  -9.4
2011    1   11  -13.3
2011    1   12  -17.9
2011    1   14  -11.8
2011    1   15  -11.2
2011    1   16  -7.1
2011    1   17  -7.6
2011    1   18  -9.9
2011    1   20  -6.9
2011    1   21  -8.8
2011    1   22  -11.3
2011    1   24  -3.1
2011    1   25  -0.7
2011    1   26  0.8
2011    1   27  -0.9
2011    1   28  -6.9
2011    1   29  -3.2
2011    1   30  -2.3
2011    1   31  -7

如您所见,在 2011 年的第一个月,许多值缺失,我需要为这些值打开一行然后填充。有什么办法吗?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您需要由MultiIndex.from_arrays 创建的reindex date_range

    start = '2011-01-01'
    end = '2011-01-31'
    
    rng = pd.date_range(start, end)
    mux = pd.MultiIndex.from_arrays([rng.year, rng.month, rng.day], names=('year','month','day'))
    
    df = df.set_index(['year','month','day'])
    
    print (df.reindex(mux).reset_index())
    
        year  month  day   min
    0   2011      1    1  -2.3
    1   2011      1    2  -9.1
    2   2011      1    3  -4.7
    3   2011      1    4  -3.5
    4   2011      1    5   NaN
    5   2011      1    6  -1.4
    6   2011      1    7   0.1
    7   2011      1    8   NaN
    8   2011      1    9  -6.3
    9   2011      1   10  -9.4
    10  2011      1   11 -13.3
    11  2011      1   12 -17.9
    12  2011      1   13   NaN
    13  2011      1   14 -11.8
    14  2011      1   15 -11.2
    15  2011      1   16  -7.1
    16  2011      1   17  -7.6
    17  2011      1   18  -9.9
    18  2011      1   19   NaN
    19  2011      1   20  -6.9
    20  2011      1   21  -8.8
    21  2011      1   22 -11.3
    22  2011      1   23   NaN
    23  2011      1   24  -3.1
    24  2011      1   25  -0.7
    25  2011      1   26   0.8
    26  2011      1   27  -0.9
    27  2011      1   28  -6.9
    28  2011      1   29  -3.2
    29  2011      1   30  -2.3
    30  2011      1   31  -7.0
    

    【讨论】:

    • 它可以工作,但它提供相同的值而不会填充缺失的行“NAN”
    • 嗯,问题可能是你的数据没有排序,所以值在另一行。
    • 一个问题 - 您是否将结束日期设置为约会的最后日期?
    • 我认为end = '2011-01-31'
    • 我有一个从 2011 年到 2016 年的数据集,并且缺少月份中的某些天数。我想知道代码如何用 NAN 填充这一行,因为日期排序也是错误的,因为缺少日期值。
    【解决方案2】:

    将 DataFrame 转换为具有日期时间索引的时间序列,然后使用 asfreq 将索引的频率更改为每日 ('D'):

    import pandas as pd
    
    raw = """2011    1   1   -2.3
    2011    1   2   -9.1
    2011    1   3   -4.7
    2011    1   4   -3.5
    2011    1   6   -1.4"""
    
    # Parse the rows into dates and values
    new_rows = []
    for row in raw.split('\n'):
        date = pd.to_datetime('/'.join(row.split()[:3]))
        value = row[-1]
        new_rows.append({'date': date, 'value': value})
    
    timeseries = pd.DataFrame(new_rows).set_index('date')
    timeseries.asfreq('D')
    

    【讨论】:

      【解决方案3】:

      我认为df.replace() 可以胜任:

      df = pd.DataFrame([
          [-0.532681, 'foo', 0],
          [1.490752, 'bar', 1],
          [-1.387326, 'foo', 2],
          [0.814772, 'baz', ' '],     
          [-0.222552, '   ', 4],
          [-1.176781,  'qux', '  '],         
      ], columns='A B C'.split(), index=pd.date_range('2000-01-01','2000-01-06'))
      
      print df.replace(r'\s+', np.nan, regex=True)
      

      生产:

              A             B   C
      2000-01-01 -0.532681  foo   0
      2000-01-02  1.490752  bar   1
      2000-01-03 -1.387326  foo   2
      2000-01-04  0.814772  baz NaN
      2000-01-05 -0.222552  NaN   4
      2000-01-06 -1.176781  qux NaN
      

      【讨论】:

        【解决方案4】:

        是的,使用 Pandas

        • 创建一个以您的日期为索引的数据框
        • 使用 asfreq

        希望这会有所帮助,请参阅http://pandas.pydata.org/pandas-docs/stable/timeseries.html 了解更多信息 :)

        【讨论】:

          猜你喜欢
          • 2015-08-19
          • 1970-01-01
          • 2017-09-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多