【问题标题】:How to swap index and values on pandas dataframe如何在熊猫数据框中交换索引和值
【发布时间】:2017-10-02 13:11:19
【问题描述】:

我有一些数据,其中索引是一个阈值,值是 0 和 1 两个类别的 trns(真阴性率)。

我想为每个类获取与该 tnr 对应的阈值的 tnr 索引的数据框。本质上,我想要这个:

我可以通过以下方式实现这个效果:

pd.concat([pd.Series(data[0].index.values, index=data[0]), 
           pd.Series(data[1].index.values, index=data[1])], 
           axis=1)

或者,推广到任意数量的列:

def invert_dataframe(df): 
    return pd.concat([pd.Series(df[col].index.values, 
                     index=df[col]) for col in df.columns], 
                     axis=1)

但是,这似乎非常 hacky 并且容易出错。有没有更好的方法来做到这一点,是否有原生 Pandas 功能可以做到这一点?

【问题讨论】:

    标签: python pandas dataframe indexing reindex


    【解决方案1】:

    您可以将stackpivot 一起使用:

    data = pd.DataFrame({0:[10,20,31],10:[4,22,36],
                         1:[7,5,6]}, index=[2.1,1.07,2.13])
    
    print (data)
          0   1   10
    2.10  10   7   4
    1.07  20   5  22
    2.13  31   6  36
    
    df = data.stack().reset_index()
    df.columns = list('abc')
    df = df.pivot(index='c', columns='b', values='a')
    print (df)
    b     0     1     10
    c                   
    4    NaN   NaN  2.10
    5    NaN  1.07   NaN
    6    NaN  2.13   NaN
    7    NaN  2.10   NaN
    10  2.10   NaN   NaN
    20  1.07   NaN   NaN
    22   NaN   NaN  1.07
    31  2.13   NaN   NaN
    36   NaN   NaN  2.13
    

    【讨论】:

    • 有趣,不过我确实得到了KeyError: 'level_0'
    • 嗯,我将列值分配给列表,也许现在它可以工作了。
    • 但是,这似乎有效:s = data.stack().reset_index(name='a')df = s.pivot(index='a', columns='level_1')
    猜你喜欢
    • 2017-12-19
    • 2021-08-23
    • 2017-07-23
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 2022-07-10
    • 2019-05-21
    相关资源
    最近更新 更多