【问题标题】:Python: DataFrame.melt - How to select a range of columns as the identifier variables?Python:DataFrame.melt - 如何选择一系列列作为标识符变量?
【发布时间】:2019-06-25 04:31:21
【问题描述】:

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

目前有:

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

【问题讨论】:

    标签: python pandas dataframe pivot


    【解决方案1】:

    我认为问题在于您错误地引用了列名。另外,我相信你的代码中倒置了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 作为你想要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 列。

    【讨论】:

    • 您使用的是列数组,但不是范围。这也可能吗?我试过value_vars=[0:1],但这似乎不起作用。
    • @AxelKöhler,您需要使用range 来指定您需要的列名范围。因此,如果您想使用列 names [0,1,2,...,8,9],那么您可以使用 value_vars=list(range(0,10)),其中 list(range(0,10)) 对应于列名称。如果您想使用列索引 0,1,2,...,8,9 的范围,则需要使用value_vars=df.columns.tolist()[0:10],其中df.columns.tolist()[0:10] 对应于列名。
    • 好的,如果应用程序期望这些列名作为字符串呢? ?
    • 没关系,这样就可以了:[str(x) for x in range(1961,2014)]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多