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

标签 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

最佳答案

我认为最简单的是列是唯一的,分配由 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

关于python - 将对称混合类型多索引转换为整数多索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43662201/

相关文章:

python - 从 DBPedia 获取所有(荷兰语)属性,包括前缀

python - 生成小数点后一位数字的浮点型随机数

python - 检查跨周期边界的欧氏距离

python - Pandas 中的 Groupby 子句

python - 连接时向 MultiIndex 添加新级别

python - 根据 pandas 中的 csv 文件名重命名列

python - 根据列值返回用户列表

Python 无法将请求绑定(bind)到网络接口(interface)

python - 如何按列分组并将其他列的值作为 pandas 中的列表返回?

python - 使用 Python 从 JSON API 中提取数据