Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 重置多索引的内部级别_Python_Pandas - Fatal编程技术网

Python 重置多索引的内部级别

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

我有以下格式的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       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