【问题标题】:Pandas Melt with Multi Index Data Set and Resetting Index - Why is this working?带有多索引数据集和重置索引的 Pandas Melt - 为什么会这样?
【发布时间】:2019-05-23 20:17:33
【问题描述】:

我直接根据 pandas 文档创建了这个数据集:

In [28]: columns = pd.MultiIndex.from_tuples([('A', 'cat'), ('B', 'dog'),
   ....:                                      ('B', 'cat'), ('A', 'dog')],
   ....:                                     names=['exp', 'animal'])
   ....: 

In [29]: index = pd.MultiIndex.from_product([('one', 'two'),
                                             ('bar', 'baz', 'foo', 'qux')
   ....:                                     ],
   ....:                                    names=['first', 'second'])
   ....: 

In [30]: df = pd.DataFrame(np.random.randn(8, 4), index=index, columns=columns)

MultiIndex 数据集(列和行)如下所示:

我想得到这样的东西[图像被截断,但你明白了]

可能有无数种方法可以重塑它,但我想使用 unstack() 和 melt() 完成它

这是我想出的两种方法:

    1. pd.melt(df.reset_index(),id_vars=['first','second'])
    2. pd.melt(df.unstack().reset_index(),id_vars=['first'])

这就是我卡住的地方:为什么会这样?

df.reset_index() 给了我这个数据框

这些列

'first' 和 'second' 不出现在列名中。它们是 exp 列的实际级别。所以我想知道如果我在熔体中为 id_vars 添加更多级别会发生什么

如果我将熔体更改为

pd.melt(df.reset_index(),id_vars=['first','second','A'])

我收到以下错误:

ValueError: 数组的长度必须相同

如果我将熔体更改为

pd.melt(df.reset_index(),id_vars=['first','second','dog'])

我收到以下错误:

KeyError: '狗'

有人可以用 reset_index() 解释一下在幕后直观地发生了什么吗?为什么 melt 不接受其他级别?为什么“第一”和“第二”显示为级别而不是列?

【问题讨论】:

  • 您在列上有一个MultiIndex,因此df.reset_index()['first'] 将在第0 级为'first' 的位置分割您的列。如果您执行了df.reset_index()['A'],您将返回系列('A', 'cat')('A', 'dog') 的DataFrame,这就是它抱怨的原因。为每个 id_var 提供的数据需要是一维的,所以像 id_vars=['first', ('A', 'cat')] 这样的东西工作
  • 谢谢!这是我怀疑的。 id_vars=['first', ('A', 'cat')] 帮助我弄清楚了这一点!

标签: python pandas dataframe


【解决方案1】:

有一个函数叫stack

yourdf=df.stack([0,1]).reset_index(name='value')

【讨论】:

猜你喜欢
  • 2011-03-06
  • 2021-05-12
  • 2014-12-23
  • 1970-01-01
  • 2020-11-10
  • 1970-01-01
  • 2020-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多