在熊猫系列中删除层次结构索引的第一个元素

时间:2018-09-25 07:44:27

标签: python python-3.x pandas pandas-groupby

在对熊猫数据框进行分组之后,得到以下系列:

client      Date       Amount
0000000001  date1      val1
            date2      val2
            date3      val3
            date4      val4
            date5      val5
0000000002  date2      val6
            date4      val7
0000000003  date1      val8
            date2      val9
0000000004  date2      val10
            date3      val11
            date4      val12
            date5      val13

问题是,如何为每个删除的客户端获取第一个条目?那就是:

0000000001  date2      val2
            date3      val3
            date4      val4
            date5      val5
0000000002  date4      val7
0000000003  date2      val9
0000000004  date3      val11
            date4      val12
            date5      val13

我担心这个问题很琐碎,并且与层次结构索引有关,但是我无法解决。

1 个答案:

答案 0 :(得分:1)

使用boolean indexing

df1 = df[df.index.get_level_values(0).duplicated()]
print (df1)
                 Amount
client     Date        
0000000001 date2   val2
           date3   val3
           date4   val4
           date5   val5
0000000002 date4   val7
0000000003 date2   val9
0000000004 date3  val11
           date4  val12
           date5  val13

详细信息

首先通过get_level_values获取第一级的值:

print (df.index.get_level_values(0))
Index(['0000000001', '0000000001', '0000000001', '0000000001', '0000000001',
       '0000000002', '0000000002', '0000000003', '0000000003', '0000000004',
       '0000000004', '0000000004', '0000000004'],
      dtype='object', name='client')

然后不通过duplicated先返回所有值:

print (df.index.get_level_values(0).duplicated())
[False  True  True  True  True False  True False  True False  True  True
  True]

如果可能,请重复groups

print (df)
                 Amount
client     Date        
0000000001 date1   val1
           date2   val2
           date3   val3
           date4   val4
           date5   val5
0000000002 date2   val6
           date4   val7
0000000003 date1   val8
           date2   val9
0000000001 date2  val10
           date3  val11
           date4  val12
           date5  val13

s = df.index.get_level_values(0).to_series()
df1 = df[s.ne(s.shift()).cumsum().duplicated().values]
print (df1)
                 Amount
client     Date        
0000000001 date2   val2
           date3   val3
           date4   val4
           date5   val5
0000000002 date4   val7
0000000003 date2   val9
0000000001 date3  val11
           date4  val12
           date5  val13

详细信息

print (s.ne(s.shift()).cumsum())
client
0000000001    1
0000000001    1
0000000001    1
0000000001    1
0000000001    1
0000000002    2
0000000002    2
0000000003    3
0000000003    3
0000000001    4
0000000001    4
0000000001    4
0000000001    4
Name: client, dtype: int32