删除系列中层次索引的第一个元素

2024-06-17 08:30:44 发布

您现在位置:Python中文网/ 问答频道 /正文

在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

我担心这个问题很琐碎,而且与层次索引有关,但我无法解决它


Tags: pandasval2date1val3val4val5date2date3
1条回答
网友
1楼 · 发布于 2024-06-17 08:30:44

使用^{}

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

详细信息

通过^{}首先获取第一级的值:

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')

然后返回所有不带第一个by ^{}的值:

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

相关问题 更多 >