【问题标题】:Slice multi-index pandas dataframe by date按日期切片多索引熊猫数据帧
【发布时间】:2020-08-30 20:59:32
【问题描述】:

假设我有以下多索引数据框:

arrays = [np.array(['bar', 'bar', 'bar', 'bar', 'foo', 'foo', 'foo', 'foo']),
          pd.to_datetime(['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04', '2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04'])]
df = pd.DataFrame(np.zeros((8, 4)), index=arrays)

                 0    1    2    3
bar 2020-01-01  0.0  0.0  0.0  0.0
    2020-01-02  0.0  0.0  0.0  0.0
    2020-01-03  0.0  0.0  0.0  0.0
    2020-01-04  0.0  0.0  0.0  0.0
foo 2020-01-01  0.0  0.0  0.0  0.0
    2020-01-02  0.0  0.0  0.0  0.0
    2020-01-03  0.0  0.0  0.0  0.0
    2020-01-04  0.0  0.0  0.0  0.0

如何仅选择此数据帧中第一个索引level = 'bar'date > 2020.01.02 的部分,以便我可以在这部分添加1?

为了更清楚,预期的输出是:

                 0    1    2    3
bar 2020-01-01  0.0  0.0  0.0  0.0
    2020-01-02  0.0  0.0  0.0  0.0
    2020-01-03  1.0  1.0  1.0  1.0
    2020-01-04  1.0  1.0  1.0  1.0
foo 2020-01-01  0.0  0.0  0.0  0.0
    2020-01-02  0.0  0.0  0.0  0.0
    2020-01-03  0.0  0.0  0.0  0.0
    2020-01-04  0.0  0.0  0.0  0.0

我设法根据第一个索引对其进行切片:

df.loc['bar']

但是我无法在日期应用条件。

【问题讨论】:

    标签: python pandas dataframe slice multi-index


    【解决方案1】:

    这里可以比较每个级别,然后设置1: 用于DataFrame.loc 中的所有列:

    m1 = df.index.get_level_values(0) =='bar' 
    m2 = df.index.get_level_values(1) > '2020-01-02'
    
    df.loc[m1 & m2, :] = 1
    print (df)
    
                      0    1    2    3
    bar 2020-01-01  0.0  0.0  0.0  0.0
        2020-01-02  0.0  0.0  0.0  0.0
        2020-01-03  1.0  1.0  1.0  1.0
        2020-01-04  1.0  1.0  1.0  1.0
    foo 2020-01-01  0.0  0.0  0.0  0.0
        2020-01-02  0.0  0.0  0.0  0.0
        2020-01-03  0.0  0.0  0.0  0.0
        2020-01-04  0.0  0.0  0.0  0.0
    

    【讨论】:

      【解决方案2】:
      #give ur index names :
      df.index = df.index.set_names(["names","dates"])
      
      #get the indices that match ur condition
      index = df.query('names=="bar" and dates>"2020-01-02"').index
      
      #assign 1 to the relevant points
      #IndexSlice makes slicing multiindexes easier ... here though, it might be seen as overkill
      idx = pd.IndexSlice
      df.loc[idx[index],:] = 1
      
      
                       0  1   2   3
      names   dates               
      bar 2020-01-01  0.0 0.0 0.0 0.0
          2020-01-02  0.0 0.0 0.0 0.0
          2020-01-03  1.0 1.0 1.0 1.0
          2020-01-04  1.0 1.0 1.0 1.0
      foo 2020-01-01  0.0 0.0 0.0 0.0
          2020-01-02  0.0 0.0 0.0 0.0
          2020-01-03  0.0 0.0 0.0 0.0
          2020-01-04  0.0 0.0 0.0 0.0
      

      【讨论】:

        猜你喜欢
        • 2017-02-22
        • 2021-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-27
        • 2018-07-28
        • 2019-10-28
        • 2022-11-03
        相关资源
        最近更新 更多