如果包含,则展平多索引数据帧级别并从列名末尾删除字符串

Flatten multiindex dataframe levels and remove string from end of column names if contains

我有一个这样的数据框

df = pd.DataFrame(
np.arange(2, 11).reshape(-1, 3),
index=list('ABC'),
columns=pd.MultiIndex.from_arrays([
    ['data1', 'data2','data3'],
    ['F', 'K',''],
    ['', '','']
], names=['meter', 'Sleeper',''])
).rename_axis('Index')

df

meter   data1 data2 data3
Sleeper     F     K                             
Index                    
A           2     3     4
B           5     6     7
C           8     9    10

所以我想加入关卡名称并扁平化数据 按照这个解决方案 Pandas dataframe with multiindex column - merge levels

  df.columns = df.columns.map('_'.join).str.strip('|')
  df.reset_index(inplace=True)

得到这个

 Index  data1_F_    data2_K_    data3__
0   A     2            3         4
1   B     5            6         7
2   C     8            9        10

但我不想要那些 _ 列名称的末尾,所以我添加了

df.columns = df.columns.apply(lambda x: x[:-1] if x.endswith('_') else x)
df

但是得到了

AttributeError: 'Index' object has no attribute 'apply'

我如何合并 mapapply(将列名称展平并删除列名称末尾的 _ 到一个 运行 中?

预期输出

  Index data1_F     data2_K   data3
0   A     2            3         4
1   B     5            6         7
2   C     8            9        10

谢谢

你可以试试这个:

df.columns = df.columns.map('_'.join).str.strip('_')
df
Out[132]: 
       data1_F  data2_K  data3
Index                         
A            2        3      4
B            5        6      7
C            8        9     10