我有一个具有两级索引的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
答案 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