【问题标题】:Python 2.7: shift a dataframe by day and a column valuePython 2.7:按天和列值移动数据框
【发布时间】:2017-08-08 09:41:48
【问题描述】:

我有一个名为 df1 的数据框,如下所示:

df1:

               a   b    id
2010-01-01     2   3    21
2010-01-01     2   4    22
2010-01-01     3   5    23
2010-01-01     4   6    24
2010-01-02     1   4    21
2010-01-02     2   5    22
2010-01-02     3   6    23
2010-01-02     4   7    24
2010-01-03     1   8    21
2010-01-03     2   9    22
2010-01-03     3   10    23
2010-01-03     4   11   24
...........................

我想移动a、b和id的值,第i行的值变成第i+1行的值。可以看到df1,同一个日期有好几行,id不一样。我想移动df1,我的意思是2010-01-02值是基于id的2010-01-03值(我的意思是id 21的2010-01-02值是2010-01- 03 id 21 的值)。谢谢!

我想要的答案:

                a   b    id
2010-01-01     Nan   Nan    Nan
2010-01-01     Nan   Nan    Nan
2010-01-01     Nan   Nan    Nan
2010-01-01     Nan   Nan    Nan
2010-01-02     2   3    21
2010-01-02     2   4    22
2010-01-02     3   5    23
2010-01-02     4   6    24
2010-01-03     1   4    21
2010-01-03     2   5    22
2010-01-03     3   6    23
2010-01-03     4   7    24
...........................

【问题讨论】:

  • 你能发布你想要的数据集吗?
  • 每个日期的行数和id值集是否相同?我要问的是 2010-01-01 我们有四行,我们也有四行 2010-01-02。整个数据都是这样吗?所有日期都有四行吗?另外,在这个例子中,id 值的集合是 21 到 24。这在整个数据中是否一致?
  • 感谢您的 cmets!行数,id都一样

标签: python python-2.7 pandas dataframe


【解决方案1】:

如果所有组的长度相同(在示例 4 中)并且 DatetimeIndex 已排序:

df2 = df.shift((df.index == df.index[0]).sum())
print (df2)
              a    b    id
2010-01-01  NaN  NaN   NaN
2010-01-01  NaN  NaN   NaN
2010-01-01  NaN  NaN   NaN
2010-01-01  NaN  NaN   NaN
2010-01-02  2.0  3.0  21.0
2010-01-02  2.0  4.0  22.0
2010-01-02  3.0  5.0  23.0
2010-01-02  4.0  6.0  24.0
2010-01-03  1.0  4.0  21.0
2010-01-03  2.0  5.0  22.0
2010-01-03  3.0  6.0  23.0
2010-01-03  4.0  7.0  24.0

但如果需要将索引值移动一天:

df3 = df.shift(1, freq='D')
print (df3)
            a   b  id
2010-01-02  2   3  21
2010-01-02  2   4  22
2010-01-02  3   5  23
2010-01-02  4   6  24
2010-01-03  1   4  21
2010-01-03  2   5  22
2010-01-03  3   6  23
2010-01-03  4   7  24
2010-01-04  1   8  21
2010-01-04  2   9  22
2010-01-04  3  10  23
2010-01-04  4  11  24

【讨论】:

    【解决方案2】:

    如果日期已排序,其中一种方法是借助形状,即

    df.shift(df.loc[df.index[0]].shape[0])
    # Or len 
    df.shift(len(df.loc[df.index[0]]))
    

    输出:

    投标 2010-01-01 NaN NaN NaN 2010-01-01 NaN NaN NaN 2010-01-01 NaN NaN NaN 2010-01-01 NaN NaN NaN 2010-01-02 2.0 3.0 21.0 2010-01-02 2.0 4.0 22.0 2010-01-02 3.0 5.0 23.0 2010-01-02 4.0 6.0 24.0 2010-01-03 1.0 4.0 21.0 2010-01-03 2.0 5.0 22.0 2010-01-03 3.0 6.0 23.0 2010-01-03 4.0 7.0 24.0

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-30
      • 2023-04-02
      • 2014-09-19
      • 1970-01-01
      • 2022-11-17
      • 2014-11-17
      相关资源
      最近更新 更多