Pandas将非重叠列上的分层索引展开

4
我有一个dataframe,并将索引设置为dataframe的一列。这样会创建一个分层列索引。我想将这些列展平为单个级别。与此问题类似 - Python Pandas - 如何展平列中的分层索引,但是这些列不重叠(即'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个回答

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作为索引和列,这非常冗余,您可以这样做:

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
给定:
>>> 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

为了打印漂亮,您可以通过重置索引并使用 .to_string 生成一个 DataFrame 的副本:

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

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毫无意义。


你好,能帮忙回答一下这个问题吗? - Scope

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接