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是,日期和观测单位是唯一的。我看到了.Somux=[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