add_suffix到基于位置的列名

时间:2018-10-01 11:33:24

标签: python pandas

我有一个数据集,我想根据列的位置向列名添加后缀。对于第1至第4列,应将其命名为“ abc_1”,然后将第5至第8列命名为“ abc_2”,依此类推。

我尝试使用dataframe.rename
但这是一个耗时的过程。实现这一目标的最有效方法是什么?

1 个答案:

答案 0 :(得分:1)

我认为这是一个不错的选择,创建MultiIndex以避免重复的列名-按楼层划分除以4创建第一级,并按f-string添加前缀:

np.random.seed(123)

df = pd.DataFrame(np.random.randint(10, size=(5, 10)))

df.columns = [[f'abc_{i+1}' for i in df.columns // 4], df.columns]
print (df)
  abc_1          abc_2          abc_3   
      0  1  2  3     4  5  6  7     8  9
0     2  2  6  1     3  9  6  1     0  1
1     9  0  0  9     3  4  0  0     4  1
2     7  3  2  4     7  2  4  8     0  7
3     9  3  4  6     1  5  6  2     1  8
4     3  5  0  2     6  2  4  4     6  3

如果列名中没有RangeIndex,则为更通用的解决方案:

cols = [f'abc_{i+1}' for i in np.arange(len(df.columns)) // 4]
df.columns = [cols, df.columns]
print (df)
  abc_1          abc_2          abc_3   
      0  1  2  3     4  5  6  7     8  9
0     2  2  6  1     3  9  6  1     0  1
1     9  0  0  9     3  4  0  0     4  1
2     7  3  2  4     7  2  4  8     0  7
3     9  3  4  6     1  5  6  2     1  8
4     3  5  0  2     6  2  4  4     6  3

也可以通过MultiIndex.from_arrays指定MultiIndex级别名称:

df.columns = pd.MultiIndex.from_arrays([cols, df.columns], names=('level0','level1'))
print (df)
level0 abc_1          abc_2          abc_3   
level1     0  1  2  3     4  5  6  7     8  9
0          2  2  6  1     3  9  6  1     0  1
1          9  0  0  9     3  4  0  0     4  1
2          7  3  2  4     7  2  4  8     0  7
3          9  3  4  6     1  5  6  2     1  8
4          3  5  0  2     6  2  4  4     6  3

然后可以通过xs选择每个级别:

print (df.xs('abc_2', axis=1))
   4  5  6  7
0  3  9  6  1
1  3  4  0  0
2  7  2  4  8
3  1  5  6  2
4  6  2  4  4