如何为每个列名添加后缀(或前缀)?


88

我想为_x每个列名添加后缀,如下所示:

featuresA = myPandasDataFrame.columns.values + '_x'

我该怎么做呢?另外,如果要添加x_后缀,解决方案将如何更改?

Answers:



163

我认为以下是添加后缀的最佳方法。

df = df.add_suffix('_some_suffix')

由于它是在DataFrame上调用并返回DataFrame的函数-您可以在调用链中使用它。


14
如果要在名称中添加前缀,则可以使用add_prefix。
豪尔赫

9
太糟糕了,这是不可变的(即没有inplace=True参数选项)。否则,完美。
ijoseph

我认为这在某些情况下比公认的答案更好,因为它可以在单个语句中的一系列操作中使用,而不需要自己的语句。
勒普顿船长

@CaptainLepton时不会这个答案比接受的答案更好
baxx

1
如果后缀不是常数。标题谈论后缀。帖子将范围缩小到一个常数后缀,但是如果我们以笼统的方式回答帖子标题,则通过列表理解或其他可迭代的方式设置列会更加灵活
Lepton船长

17

优雅的原位串联

如果您尝试df就地修改,则最便宜(也是最简单)的选项是直接在就地添加df.columns(即使用Index.__iadd__)。

df = pd.DataFrame({"A": [9, 4, 2, 1], "B": [12, 7, 5, 4]})
df

   A   B
0  9  12
1  4   7
2  2   5
3  1   4

df.columns += '_some_suffix'
df

   A_some_suffix  B_some_suffix
0              9             12
1              4              7
2              2              5
3              1              4

要添加前缀,您可以类似地使用

df.columns = 'some_prefix_' + df.columns
df

   some_prefix_A  some_prefix_B
0              9             12
1              4              7
2              2              5
3              1              4

另一个便宜的选择是使用带有f-string格式的列表理解(在python3.6 +上可用)。

df.columns = [f'{c}_some_suffix' for c in df]
df

   A_some_suffix  B_some_suffix
0              9             12
1              4              7
2              2              5
3              1              4

对于前缀,类似地,

df.columns = [f'some_prefix{c}' for c in df]

方法链接

在方法链接时也可以添加* fix。要添加后缀,请使用DataFrame.add_suffix

df.add_suffix('_some_suffix')

   A_some_suffix  B_some_suffix
0              9             12
1              4              7
2              2              5
3              1              4

这将返回数据的副本。IOW,df未修改。

也可以使用添加前缀DataFrame.add_prefix

df.add_prefix('some_prefix_')

   some_prefix_A  some_prefix_B
0              9             12
1              4              7
2              2              5
3              1              4

里面也没有修改df


批判 add_*fix

如果您尝试执行方法链接,这些是好的方法:

df.some_method1().some_method2().add_*fix(...)

但是,add_prefix(和add_suffix)创建整个数据帧的副本,只是为了修改标题。如果您认为这样做很浪费,但仍然希望进行链接,则可以致电pipe

def add_suffix(df):
    df.columns += '_some_suffix'
    return df

df.some_method1().some_method2().pipe(add_suffix)

真优雅!如果您想在列的子集中添加前缀或后缀,例如其名称都包含一个通用词(如newold)而不是每个列的列,该怎么办?谢谢。
Bowen Liu

1
@BowenLiu我建议改为使用df.rename()...传递将名称映射到其新名称的字典。然后使用axis = 1调用重命名。您还可以使用条件列表理解分配。
cs95

仅将常规数据类型用作列名,如果列是RangeIndex之类的df = pd.DataFrame([[1,2,3]]*10)-> df.columns,则不能使用,则应使用df.add_suffix('_x')
Lorenz

您可以df.columns = df.columns.astype(str) + '_x' 按照我的第一种方法进行操作。
cs95

4

我没有看到上面提出的解决方案,因此将其添加到列表中:

df.columns += '_x'

而且您可以轻松适应前缀方案。


后缀的最佳解决方案,尽管它不能用作前缀。
洛伦兹

仅适用于列名称中的常规数据类型,而不适用于列为df = pd.DataFrame([[1,2,3]]*10)->这样的RangeIndex时df.columns,那么您将使用df.add_suffix('_x')
Lorenz

1

我知道4种为列名添加后缀(或前缀)的方法:

1- df.columns = [str(col) + '_some_suffix' for col in df.columns]

要么

2 df.rename(columns= lambda col: col+'_some_suffix')

要么

3-df.columns += '_some_suffix'更多。

或者,最好的:

3 df.add_suffix('_some_suffix')


0

使用DataFrame.rename

add_prefix和弃用add_suffix

在大熊猫的未来版本add_prefixadd_suffix将被弃用。建议的新方法是使用DataFrame.rename

df = pd.DataFrame({'A': range(3), 'B': range(4, 7)})
print(df)
   A  B
0  0  4
1  1  5
2  2  6

使用renamewithaxis=1和字符串格式:

df.rename('col_{}'.format, axis=1)
# or df.rename(columns='col_{}'.format)

   col_A  col_B
0      0      4
1      1      5
2      2      6

要实际覆盖您的列名,我们可以将返回值分配给我们df

df = df.rename('col_{}'.format, axis=1)

或使用inplace=True

df.rename('col_{}'.format, axis=1, inplace=True)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.