在对熊猫数据框进行分组之后,得到以下系列:
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
我担心这个问题很琐碎,并且与层次结构索引有关,但是我无法解决。
答案 0 :(得分:1)
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