Python 将对称混合型多索引转换为整数多索引

Python 将对称混合型多索引转换为整数多索引,python,pandas,Python,Pandas,假设我有一个源自对称宽矩阵的长数据帧,例如,像在本例中的日期x观测单位 2015-01-01 2015-01-02 2015-01-03 1 0 1 3 … … … N 2 2 3 …已经变成了一个像这样的长df date observation_unit value 2015-01-01 1

假设我有一个源自对称宽矩阵的长数据帧,例如,像在本例中的
日期x观测单位

         2015-01-01  2015-01-02  2015-01-03
1        0           1           3
…        …           …
N        2           2           3
…已经变成了一个像这样的长df

date         observation_unit    value
2015-01-01   1                   0
2015-01-02   1                   1
2015-01-03   1                   3
…
2015-01-01   N                   2
2015-01-02   N                   2
2015-01-03   N                   3
在pandas中,将这些指数快速转换为从1开始的整数标记的最快方法是什么

date         observation_unit    value
1            1                   0
2            1                   1
3            1                   1
…
1            N                   2
2            N                   2
3            N                   3

我认为您最简单的是列是唯一的,是由
arrange
创建的赋值数组:

df.columns = np.arange(1,len(df.columns) + 1)
df = df.unstack()
对于多重索引,如果值不唯一,则使用:

df.index = pd.MultiIndex.from_arrays([pd.factorize(df.index.get_level_values(0))[0] + 1,
                                      df.index.get_level_values(1)], names=df.index.names)
print (df)
                       value
date observation_unit       
1    1                     0
2    1                     1
3    1                     3
1    N                     2
2    N                     2
3    N                     3
或:

或:

或者更简单:

a =  np.arange(1, len(df.index.levels[0]) + 1)
df.index = pd.MultiIndex.from_product([a, df.index.levels[1]], names=df.index.names)
print (df)
                       value
date observation_unit       
1    1                     0
     N                     1
2    1                     3
     N                     2
3    1                     2
     N                     3

最快的方法是使用
pd.factorize

df.date = pd.factorize(df.date)[0] + 1

df

   date observation_unit  value
0     1                1      0
1     2                1      1
2     3                1      3
3     1                N      2
4     2                N      2
5     3                N      3

事实上,如果我从一个数据帧
df
开始,它等于

   2015-01-01  2015-01-02  2015-01-03
1           0           1           3
N           2           2           3
我会这样变换它:

df.columns = pd.factorize(df.columns)[0] + 1
df.stack().rename_axis(['observation_unit', 'date']).reset_index(name='value')

  observation_unit  date  value
0                1     1      0
1                1     2      1
2                1     3      3
3                N     1      2
4                N     2      2
5                N     3      3

你能增加更多的价值吗?什么是
df.info()!绝对。突出-检查我的答案。是的,检查我的多重索引解决方案。你如何分解任意大小的多重索引?(每一列是独立分解的吗?)想要分解观测值(单位列):-)(可能还有更多列)我不确定是否理解,但如果需要唯一值到
int
s,最简单的是通过
np.arrangement
分配新数组,但是如果重复项需要
factorize
/ah是,日期和观测单位是唯一的。我看到了.So
mux=[np.arange(1,len(df.index.levels[x])+1)对于np.arange(df.index.nlevels)]
df.index=pd.MultiIndex.from_乘积(mux,names=df.index.names)
   2015-01-01  2015-01-02  2015-01-03
1           0           1           3
N           2           2           3
df.columns = pd.factorize(df.columns)[0] + 1
df.stack().rename_axis(['observation_unit', 'date']).reset_index(name='value')

  observation_unit  date  value
0                1     1      0
1                1     2      1
2                1     3      3
3                N     1      2
4                N     2      2
5                N     3      3