删除每个外部索引的第一行

时间:2018-01-29 14:51:23

标签: python pandas

我有一个具有两级索引的DataFrame。第一级包含列表names中的字符串,第二级包含datetime个对象。我试图删除每个外部索引的第一行

例如:

>>> print(df)

                   val1   val2
name   date
Tom    2018-01-01   2.3    5.4
       2018-01-02   3.6    8.2
Jerry  2018-02-18   5.7    1.3
       2018-02-19   7.2    3.8
names = ['Tom', 'Jerry']

for name in names:
    df.loc[name].drop(<row 0 of this name>, inplace=True)
>>> print(df)

                   val1   val2
name   date
Tom    2018-01-02   3.6    8.2
Jerry  2018-02-19   7.2    3.8

3 个答案:

答案 0 :(得分:1)

对第一个索引使用列表理解和xs

names = ['Tom', 'Jerry']
idx = [df.xs(name, drop_level=False).index[0] for name in names]
df = df.drop(idx)
print (df)
                  val1  val2
name  date                  
Tom   2018-01-02   3.6   8.2
Jerry 2018-02-19   7.2   3.8

要按第一级删除所有第一行,请使用get_level_values + duplicated作为掩码并按boolean indexing过滤:

df = df[df.index.get_level_values(0).duplicated()]
print (df)
                  val1  val2
name  date                  
Tom   2018-01-02   3.6   8.2
Jerry 2018-02-19   7.2   3.8

答案 1 :(得分:0)

首先压平指数。

df.columns = df.columns.get_level_values(0)

然后删除重复项,如下所示:

df = pd.DataFrame([['Tom', '2018-01-01', 2.3, 5.4],
                   ['Tom', '2018-01-02', 3.6, 8.2],
                   ['Jerry', '2018-02-18', 5.7, 1.3],
                   ['Jerry', '2018-02-19', 7.2, 3.8]],
                  columns=['name', 'date', 'val1', 'val2'])

df = df.drop_duplicates('name', keep='last')

答案 2 :(得分:0)

我想使用reset_index

df.reset_index().groupby(['name']).last().set_index('date',append=True)
Out[1015]: 
                  val1  val2
name  date                  
Jerry 2018-02-19   7.2   3.8
Tom   2018-01-02   3.6   8.2

或者如果在一个subgruop中超过2个

df.reset_index('name').groupby(['name']).apply(lambda x : x.iloc[1:])
Out[1018]: 
                   name  val1  val2
name  date                         
Jerry 2018-02-19  Jerry   7.2   3.8
Tom   2018-01-02    Tom   3.6   8.2