python - 为什么 pd.MultiIndex.from_tuples 改变元组的顺序

标签 python pandas dataframe

使用 from_tuples 创建多索引时,创建索引对象的顺序与输入元组的顺序不同

我正在尝试使用 pd.MultiIndex.from_tuples 方法向数据框添加列级别,但级别与我预期的不同。

df = pd.DataFrame({'x_1':[1, 2], 'x_2':[3, 4], 'x_10':[3, 4], 'y_1':[5, 6], 'y_2':[7, 8], 'y_10':[1, 2]})
df = df.reindex(columns=['x_1', 'x_2', 'x_10', 'y_1', 'y_2', 'y_10'])
index = pd.MultiIndex.from_tuples([tuple(c.split('_')) for c in df.columns])
print(index)

MultiIndex(levels=[['x', 'y'], ['1', '10', '2']],
           labels=[[0, 0, 0, 1, 1, 1], [0, 2, 1, 0, 2, 1]])

当我将级别添加到数据框并执行堆叠时,顺序不是我想要的。

df.columns = index
df.stack()

      x  y
0 1   1  5
  10  3  1
  2   3  7
1 1   2  6
  10  4  2
  2   4  8

我希望索引水平看起来像:

MultiIndex(levels=[['x', 'y'], ['1', '2', '10']])

堆叠看起来像下面这样:

df.stack()
      x  y
0 1   1  5
  2   3  7
  10  3  1
1 1   2  6
  2   4  8
  10  4  2

最佳答案

您可以 reindex在特定级别,在调用 stack 之前传递列中的级别值:

In[177]:
df.stack().reindex(df.columns.get_level_values(1).unique(), level=1)
Out[177]: 
      x  y
0 1   1  5
  2   3  7
  10  3  1
1 1   2  6
  2   4  8
  10  4  2

请注意,这会带来性能问题,因为需要对索引进行排序以进行快速查找

关于python - 为什么 pd.MultiIndex.from_tuples 改变元组的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54257519/

相关文章:

python - 使用公式将行添加到数据框

python - 使用 django-nose 但不使用 Django 的 DiscoverRunner 运行测试时出现重复键错误

python - REDIS:python 中的 redis 不返回任何内容

python - 使用 Pandas 聚合所有数据框行对组合

python - Pandas 不会重命名多索引列名

python - 如何正确使用模拟 call_args 和 Python 的unittest.mock?

python - 运行 Docker 镜像时出错。显示没有名为 cv2、request、boto3 的模块

python - Pandas:将 dbf 表转换为数据框

python - 减去下一行使用当前行,python 数据框

python - 从系列/字典中的匹配列更新 Pandas 数据框行值