Python 重置多索引的内部级别
我有以下格式的DF:Python 重置多索引的内部级别,python,pandas,Python,Pandas,我有以下格式的DF: col1 col2 ID Date 1 1993-12-31 4 6 1994-12-31 8 5 1995-12-31 4 7 1996-12-31 3 3 2 2000-12-31 7 8 2001-12-31 5
col1 col2
ID Date
1 1993-12-31 4 6
1994-12-31 8 5
1995-12-31 4 7
1996-12-31 3 3
2 2000-12-31 7 8
2001-12-31 5 9
2002-12-31 8 4
我想重置“日期”索引,给出以下内容:
col1 col2
ID Date
1 0 4 6
1 8 5
2 4 7
3 3 3
2 0 7 8
1 5 9
2 8 4
我以为只要
df.reset_index(level='Date',inplace=True,drop=True)
就可以了,但事实并非如此。您可以按ID
分组,然后使用apply
重置每组的索引:
new_df = (df.groupby(df.index.get_level_values('ID'))
.apply(lambda x: x.reset_index()).drop(['ID','Date'],1))
new_df.index = new_df.index.rename(['ID','Date'])
>>> new_df
col1 col2
ID Date
1 0 4 6
1 8 5
2 4 7
3 3 3
2 0 7 8
1 5 9
2 8 4
使用
设置索引
和累计计数
:
tmp = df.reset_index('Date', drop=True)
tmp.set_index(df.groupby(level=0).cumcount().rename('Date'), append=True)
col1 col2
ID Date
1 0 4 6
1 8 5
2 4 7
3 3 3
2 0 7 8
1 5 9
2 8 4
使用
pd.MultiIndex.from_数组
和groupby
+cumcount
df.index = pd.MultiIndex.from_arrays(
[df.index.get_level_values(0), df.groupby(level=0).cumcount()],
names=['ID', 'Date'])
这不会推广到N个级别,但应该有一个df.index.set\u级别
等效的我忘记了…新答案
不像以前的答案那么酷,但我宁愿准确也不愿酷
from collections import defaultdict
from itertools import count
d = defaultdict(count)
lbl = []
for a, *_ in df.index.values:
lbl.append(next(d[a]))
lvl = pd.RangeIndex(max(lbl) + 1)
df.set_index(df.index.set_labels(lbl, 1).set_levels(lvl, 1))
col1 col2
ID Date
1 0 4 6
1 8 5
2 4 7
3 3 3
2 0 7 8
1 5 9
2 8 4
旧答案 不要使用 我误解了这个问题。我没有看到每个组都需要重置新索引 希望对某人有用 你可以用
一行 耶<代码>\o/
df.set_index(df.index.set_levels(pd.RangeIndex(len(df.index.levels[1])), 1))
col1 col2
ID Date
1 0 4 6
1 8 5
2 4 7
3 3 3
2 4 7 8
5 5 9
6 8 4
在正确的位置
我发现这个解决方案最容易遵循。
n = 1
lvl = df.index.levels[n]
new_lvl = pd.RangeIndex(len(lvl))
new_idx = df.index.set_levels(new_lvl, n)
df.set_index(new_idx)
col1 col2
ID Date
1 0 4 6
1 8 5
2 4 7
3 3 3
2 4 7 8
5 5 9
6 8 4
df.set_index(df.index.set_levels(pd.RangeIndex(len(df.index.levels[1])), 1))
col1 col2
ID Date
1 0 4 6
1 8 5
2 4 7
3 3 3
2 4 7 8
5 5 9
6 8 4
df.index.set_levels(pd.RangeIndex(len(df.index.levels[1])), 1, inplace=True)
df
col1 col2
ID Date
1 0 4 6
1 8 5
2 4 7
3 3 3
2 4 7 8
5 5 9
6 8 4