【问题标题】:How to fill in pandas date seriespandas日期系列如何填写
【发布时间】:2019-01-13 11:14:49
【问题描述】:

我有一个看起来像这样的 pandas 数据框:

    year    week  val1   val2
0   2017   45     10.1   20.2
0   2017   48     10.3   20.3
0   2017   49     10.4   20.4
0   2017   52     10.3   20.5
0   2018    1     10.1   20.2
0   2018    2     10.3   20.3
0   2018    5     10.4   20.4
0   2018    9     10.3   20.5
....

请注意,周不是连续的。用 val1 和 val2 数字作为 NaN 填充缺少的行的最佳方法是什么?例如,我的年份是从 2017 年到 2018 年,我的周数是 45-52 和 1-9。

非常感谢。

【问题讨论】:

  • 您的预期结果是什么?你还试过什么?
  • 你有没有尝试过任何解决方案?
  • 你试过fillna()吗?
  • this question 可能重复 - 虽然没有接受的答案,所以不能用它来投票关闭。

标签: python pandas dataframe series


【解决方案1】:

您可以 groupby 年份,然后 reindex 与现有值和缺失值的并集:

(df.set_index("week")
   .groupby("year")
   .apply(lambda x: x.reindex(x.index.union(np.arange(x.index.min(),x.index.max()))))
   .drop("year", 1)
   .reset_index()
   .rename(columns={"level_1":"week"}))

    year  week  val1  val2
0   2017    45  10.1  20.2
1   2017    46   nan   nan
2   2017    47   nan   nan
3   2017    48  10.3  20.3
4   2017    49  10.4  20.4
5   2017    50   nan   nan
6   2017    51   nan   nan
7   2017    52  10.3  20.5
8   2018     1  10.1  20.2
9   2018     2  10.3  20.3
10  2018     3   nan   nan
11  2018     4   nan   nan
12  2018     5  10.4  20.4
13  2018     6   nan   nan
14  2018     7   nan   nan
15  2018     8   nan   nan
16  2018     9  10.3  20.5

【讨论】:

    【解决方案2】:

    我会创建一个参考数据框并合并

    ref = pd.DataFrame(
        [[y, w] for y, s in df.groupby('year').week for w in range(s.min(), s.max() + 1)],
        columns=['year', 'week']
    )
    
    ref.merge(df, 'left')
    
        year  week  val1  val2
    0   2017    45  10.1  20.2
    1   2017    46   NaN   NaN
    2   2017    47   NaN   NaN
    3   2017    48  10.3  20.3
    4   2017    49  10.4  20.4
    5   2017    50   NaN   NaN
    6   2017    51   NaN   NaN
    7   2017    52  10.3  20.5
    8   2018     1  10.1  20.2
    9   2018     2  10.3  20.3
    10  2018     3   NaN   NaN
    11  2018     4   NaN   NaN
    12  2018     5  10.4  20.4
    13  2018     6   NaN   NaN
    14  2018     7   NaN   NaN
    15  2018     8   NaN   NaN
    16  2018     9  10.3  20.5
    

    【讨论】:

      【解决方案3】:

      我会使用Time Series / Date functionality。将yearweek 列组合并转换为日期时间索引,并使用以下内容重新采样您的数据框:

      df.index = pd.to_datetime(
          df.year.map(str) + " " + df.week.map(str) + " 3", 
          format="%Y %W %w"
      )
      df = df.resample("W").mean()
      df.year = df.index.year
      df.week = df.index.week
      

      请注意,您的索引已被覆盖。

      【讨论】:

      • 我最喜欢这个,但在更大的数据集上,为什么 2016 年只给我 51 周?
      • 这很奇怪。我尝试了以下数据:df = pd.DataFrame({"year": [2016, 2016, 2017], "week": [1,4,5], "val1": [1,2,3]}),我在 2016 年得到了 52 周。你能举一个只产生 51 周的例子吗?
      猜你喜欢
      • 1970-01-01
      • 2012-04-25
      • 2019-04-19
      • 1970-01-01
      • 1970-01-01
      • 2019-11-01
      • 2017-09-15
      相关资源
      最近更新 更多