首页 > 解决方案 > Python:DataFrame.melt - 如何选择一系列列作为标识符变量?

问题描述

我正在尝试更改数据集的结构

目前有:

RE id    Country    0    1   2    ...    n
1001     CN,TH     CN   TH   nan  ...    nan
1002     UK        UK   nan  nan  ...    nan

我已将 Country 列拆分出来,因此添加了其他列。现在我正在尝试使用 df.melt 来获得这个:

RE id    var  val 
1001      0   CN 
1001      0   TH 

所以我最终可以通过使用枢轴来实现这一点

RE id     Country
1001      TH
1001      CN

我试过了:

df = a.melt(id_vars=[a[[0]],a[[1]],a[[2]]], value_vars=['RE id'])

如何选择数据框中的列范围以用作标识符变量? https://pandas.pydata.org/pandas-docs/version/0.23.4/generated/pandas.DataFrame.melt.html#pandas.DataFrame.melt

标签: pythonpandasdataframepivot

解决方案


我认为问题在于您错误地引用了列名。另外,我相信您的代码中id_vars(我认为应该是Re id)和value_vars(列名01)倒置了。

这是我的处理方法

进口

import pandas as pd
import numpy as np

这是部分数据,足以证明可能的问题

a = [['Re id', 0, 1],[1001,'CN','TH'],[1002,'UK',np.nan]]
df = pd.DataFrame(a[1:], columns=a[0])
print(df)

    Re id    0    1
0    1001   CN   TH
1    1002   UK  NaN

现在,pd.melt

  1. id_vars指向Re id
  2. value_vars作为您想要的 2 列melt(即,列名01
df_melt = pd.melt(df, id_vars=['Re id'], value_vars=[0,1], value_name='Country')
df_melt.sort_values(by=['Re id', 'Country'], ascending=[True,False], inplace=True)
print(df_melt)
    Re id   variable    Country
2    1001          1         TH
0    1001          0         CN
1    1002          0         UK
3    1002          1        NaN

此外,由于您Country在单独的列 ( 0, 1) 中有名称,我认为您根本不需要使用该Country列。


推荐阅读