【问题标题】:Pandas flatten hierarchical index on non overlapping columnsPandas 在非重叠列上展平层次索引
【发布时间】:2016-10-17 00:08:46
【问题描述】:

我有一个数据框,并将索引设置为数据框的一列。这将创建一个分层列索引。我想将列展平为一个级别。类似于这个问题 - Python Pandas - How to flatten a hierarchical index in columns,但是,列不重叠(即“id”不在分层索引的第 0 级,而其他列在索引的第 1 级)。

df = pd.DataFrame([(101,3,'x'), (102,5,'y')], columns=['id', 'A', 'B'])
df.set_index('id', inplace=True)

      A    B
id
101   3    x
102   5    y

所需的输出是扁平列,如下所示:

id    A    B
101   3    x
102   5    y

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    你误解了你所看到的。

         A  B
    id       
    101  3  x
    102  5  y
    

    未向您显示分层列索引。 id 是行索引的名称。为了向您显示索引的名称,pandas 为您放置了该空间。

    问题的答案取决于您真正想要或需要什么。

    就像df 一样,您可以按照自己的方式将其转储到csv

    print(df.to_csv(sep='\t'))
    
    id  A   B
    101 3   x
    102 5   y
    

    print(df.to_csv())
    
    id,A,B
    101,3,x
    102,5,y
    

    或者您可以更改 df 使其显示您想要的方式

    print(df.rename_axis(None)) 
    
         A  B
    101  3  x
    102  5  y
    

    请不要这样做!!!!
    我用它来演示如何操作

    我也可以保持索引不变,但同时操作列和行索引名称以打印您想要的方式。

    print(df.rename_axis(None).rename_axis('id', 1))
    
    id   A  B
    101  3  x
    102  5  y
    

    但这已经将列的索引命名为id,这没有任何意义。

    【讨论】:

    • 嗨,你能帮忙回答一下this
    【解决方案2】:

    您的数据框中总会有一个索引。如果您不将 'id' 设置为索引,它将与其他列处于同一级别,并且 pandas 将从 0 开始为您的索引填充一个递增的整数。

    df = pd.DataFrame([(101,3,'x'), (102,5,'y')], columns=['id', 'A', 'B'])
    
    In[52]: df
    Out[52]: 
        id  A  B
    0  101  3  x
    1  102  5  y
    

    索引在那里,因此您可以对原始数据帧进行切片。有这样的

    df.iloc[0]
    Out[53]: 
    id    101
    A       3
    B       x
    Name: 0, dtype: object
    

    所以假设你想要 ID 作为索引和 ID 作为列,这是非常多余的,你可以这样做:

    df = pd.DataFrame([(101,3,'x'), (102,5,'y')], columns=['id', 'A', 'B'])
    df.set_index('id', inplace=True)
    df['id'] = df.index
    df
    Out[55]: 
         A  B   id
    id            
    101  3  x  101
    102  5  y  102
    

    有了这个,你可以通过 'id' 进行切片:

    df.loc[101]
    Out[57]: 
    A       3
    B       x
    id    101
    Name: 101, dtype: object
    

    但它会有相同的信息:

    df = pd.DataFrame([(101,3,'x'), (102,5,'y')], columns=['id', 'A', 'B'])
    df.set_index('id', inplace=True)
    df.loc[101]
    
    Out[58]: 
    A    3
    B    x
    Name: 101, dtype: object
    

    【讨论】:

      【解决方案3】:

      给定:

      >>> df2=pd.DataFrame([(101,3,'x'), (102,5,'y')], columns=['id', 'A', 'B'])
      >>> df2.set_index('id', inplace=True)
      >>> df2
           A  B
      id       
      101  3  x
      102  5  y
      

      对于打印 purdy,您可以生成 DataFrame 的副本并重置索引并使用.to_string

      >>> print df2.reset_index().to_string(index=False)
      id  A  B
      101  3  x
      102  5  y
      

      然后调整格式选项,使输出符合您的需求:

      >>> fmts=[lambda s: u"{:^5}".format(str(s).strip())]*3
      >>> print df2.reset_index().to_string(index=False, formatters=fmts)
      id     A      B
      101    3      x  
      102    5      y
      

      【讨论】:

        猜你喜欢
        • 2013-01-08
        • 2022-07-12
        • 1970-01-01
        • 2021-02-03
        相关资源
        最近更新 更多