我的数据框列如下所示:
>> df.columns
output:
MultiIndex([( 'Month', nan),
( 'TG', nan),
( 'Reach', 'level'),
( nan, 'plan'),
( nan, 'sth (p.p.)'),
( nan, 'final'),
( 'Prime Time', 'final'),
( nan, 'AGB'),
( nan, 'diff (p.p.)'),
( 'Prime Time', 'diff p.p.')],
names=[None, 'Campaign'])
我想填写这样的名字:
MultiIndex([( 'Month', nan),
( 'TG', nan),
( 'Reach', 'level'),
( 'Reach', 'plan'),
( 'Reach', 'sth (p.p.)'),
( 'Reach', 'final'),
( 'Prime Time', 'final'),
( 'Prime Time', 'AGB'),
( 'Prime Time', 'diff (p.p.)'),
( 'Prime Time', 'diff p.p.')],
names=[None, 'Campaign'])
最后我想得到一个带有一个名称行的扁平数据框:
'Month',
'TG',
'Reach level',
'Reach plan',
...
MultiIndex.to_frame
作为 DataFrame,使用 DataFrame.ffill
来前向填充缺失值,最后通过 MultiIndex
转换回
MultiIndex.from_frame
:
nan = np.nan
L = [('Month', nan), ('TG', nan), ('Reach', 'level'), (nan, 'plan'),
(nan, 'sth (p.p.)'), (nan, 'final'), ('Prime Time', 'final'), (nan, 'AGB'), (nan, 'diff (p.p.)'), ('Prime Time', 'diff p.p.')]
df = pd.DataFrame(columns=pd.MultiIndex.from_tuples(L))
df.columns = pd.MultiIndex.from_frame(df.columns.to_frame().ffill())
print (df.columns)
MultiIndex([( 'Month', nan),
( 'TG', nan),
( 'Reach', 'level'),
( 'Reach', 'plan'),
( 'Reach', 'sth (p.p.)'),
( 'Reach', 'final'),
('Prime Time', 'final'),
('Prime Time', 'AGB'),
('Prime Time', 'diff (p.p.)'),
('Prime Time', 'diff p.p.')],
names=[0, 1])
pandas.MultiIndex.to_frame
和 pandas.MultiIndex.from_frame
:
df.columns = pd.MultiIndex.from_frame(df.columns.to_frame().ffill(),
names=df.columns.names)
输出示例:
Month TG Reach Prime Time
Campaign NaN NaN level plan sth (p.p.) final final AGB diff (p.p.) diff p.p.
0