假设我的列上有pandas.DataFrame
层次索引,如下所示:
import pandas as pd
columns = pd.MultiIndex.from_product([list('AB'), list('ab')])
df = pd.DataFrame(np.arange(8).reshape((2,4)), columns=columns)
print df
输出[1]:
A B
a b a b
0 0 1 2 3
1 4 5 6 7
我想展平列索引,使其如下所示:
Aa Ab Ba Bb
0 0 1 2 3
1 4 5 6 7
我试过
def flatten(col):
col.name = ''.join(col.name)
return col
df.apply(f)
但是忽略了新列的修改名称。
答案 0 :(得分:15)
set_axis
df.set_axis([f"{x}{y}" for x, y in df.columns], axis=1, inplace=False)
Aa Ab Ba Bb
0 0 1 2 3
1 4 5 6 7
index.map
df.columns = df.columns.map(''.join)
df
Aa Ab Ba Bb
0 0 1 2 3
1 4 5 6 7
df.columns = df.columns.map(lambda x: ''.join([*map(str, x)]))
df
Aa Ab Ba Bb
0 0 1 2 3
1 4 5 6 7
答案 1 :(得分:3)
您可以将list comprehension
与join
:
df.columns = [''.join(col) for col in df.columns]
print (df)
Aa Ab Ba Bb
0 0 1 2 3
1 4 5 6 7
另一种可能的解决方案:
df.columns = df.columns.to_series().str.join('')
print (df)
Aa Ab Ba Bb
0 0 1 2 3
1 4 5 6 7
答案 2 :(得分:0)
以下工作但创建了新的DataFrame
:
df_flat = pd.DataFrame({''.join(k):v for k,v in df.iteritems()})
print df_flat
出[3]:
Aa Ab Ba Bb
0 0 1 2 3
1 4 5 6 7