的Python:DataFrame.melt - 如何选择一个范围作为标识符变量列?

时间:2019-01-31 16:37:22

标签: python pandas dataframe pivot

我想改变我的数据集的结构

当前拥有:

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

我将“国家/地区”列拆分为其他列。现在我试图用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

1 个答案:

答案 0 :(得分:0)

我认为问题是您未正确引用列名。另外,我相信您在代码中颠倒了id_vars(我想应该是Re idvalue_vars(列名01)。 / p>

这是我的处理方式

进口

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作为您要melt的2列(即列名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

此外,由于您在单独的列(Country0中有1个名称,所以我认为根本不需要使用Country