Pandas在非重叠列上展平分层索引

时间:2016-10-15 19:55:17

标签: python pandas

我有一个数据框,我将索引设置为数据框的一列。这将创建一个分层列索引。我想将列展平为一个级别。但是,与此问题类似 - 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

3 个答案:

答案 0 :(得分:1)

您的数据框中始终会有一个索引。如果你没有设置' 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

答案 1 :(得分:1)

假设:

>>> 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

答案 2 :(得分: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没有任何意义。