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