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

时间:2017-04-27 15:38:10

标签: python pandas

假设我有一个来自对称宽矩阵的长数据帧,例如就像在这种情况下date x observation_unit

         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

2 个答案:

答案 0 :(得分:1)

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

df.columns = np.arange(1,len(df.columns) + 1)
df = df.unstack()

对于多索引,如果值不唯一,则使用factorize

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

或者:

df.index = [pd.factorize(df.index.get_level_values(0))[0] + 1,
            df.index.get_level_values(1)]
print (df)
                    value
  observation_unit       
1 1                     0
2 1                     1
3 1                     3
1 N                     2
2 N                     2
3 N                     3

或者:

a =  pd.factorize(df.index.levels[0])[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

或更简单:

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

答案 1 :(得分:1)

最快的方法是使用(?<!growth )inhibition(.+)toxicity

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