Pandas更改列名

6

如果一个 pandas 数据帧的某个列以特定单词开头,是否可以更改该列的名称?

例如,如果列名以 DEP 开头,则将整个列名更改为 KEEP。

[col for col in df if col.startswith('DEP') then KEEP].

2
为什么要使用重复的列名?这在Pandas中并不被推荐(事实上,在数据分析中也是如此)。 - jpp
4个回答

8

这是可能的,但并不推荐,因为会出现重复的列名:

df = pd.DataFrame({
        'DEP1':list('abcdef'),
         'B':[4,5,4,5,5,4],
         'C':[7,8,9,4,2,3],
         'DEP2':list('aaabbb')
})

print (df)
  DEP1  B  C DEP2
0    a  4  7    a
1    b  5  8    a
2    c  4  9    a
3    d  5  4    b
4    e  5  2    b
5    f  4  3    b

df.columns = ['KEEP' if col.startswith('DEP') else col for col in df]
print (df)
  KEEP  B  C KEEP
0    a  4  7    a
1    b  5  8    a
2    c  4  9    a
3    d  5  4    b
4    e  5  2    b
5    f  4  3    b

因此,如果选择列KEEP,它将返回DataFrame中的所有重复列:

print (df['KEEP'])
  KEEP KEEP
0    a    a
1    b    a
2    c    a
3    d    b
4    e    b
5    f    b

所以,如果想要过滤所有以DEP开头的列,请使用带有正则表达式^filter函数:
df1 = df.filter(regex='^DEP')
#alternative solution
#df1 = df.loc[:, df.columns.str.startswith('DEP')]
print (df1)
  DEP1 DEP2
0    a    a
1    b    a
2    c    a
3    d    b
4    e    b
5    f    b

2
那个 df.columns = 非常关键! - Charles Landau
1
太棒了 - 非常感谢 - 是的,关于重复的部分我理解了。但在这种情况下没问题,因为如果它们具有相同的名称,我将将它们相加。 - fred.schwartz
1
@fred.Schwartz,如果您要对列进行求和然后舍弃它们,您实际上不必重命名它们,只需使用 df['result'] = df[cols].sum(1)。其中 cols 是您的列列表/数组。 - jpp

5
您可以将可调用对象传递给 rename 方法。
df.rename(columns=lambda x: 'KEEP' if x.startswith('DEP') else x)

您可以将其重新分配给名称df,也可以使用inplace=True参数。


3
这并不是您所要求的内容,但我强烈建议您保留在DEP之后的字符以区分您的列标签。原因是,使用重复标签会使许多Pandas功能无法使用,您会丢失信息。
一种方法是使用字典映射:
df = pd.DataFrame({'DEP123': [1, 2, 3], 'Test': [4, 5, 6],
                   'DEP983': [7, 8, 9], 'Test2': [10, 11, 12]})

mapper = {col: f'KEEP{col[3:]}' for col in df.filter(regex='^DEP')}
df = df.rename(columns=mapper)

print(df)

   KEEP123  KEEP983  Test  Test2
0        1        7     4     10
1        2        8     5     11
2        3        9     6     12

3

我同意jpp的观点,不要使用重复的列名

df.columns=df.columns.str.replace('DEP','KEEP')
df
Out[866]: 
  KEEP1  B  C KEEP2
0     a  4  7     a
1     b  5  8     a
2     c  4  9     a
3     d  5  4     b
4     e  5  2     b
5     f  4  3     b

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接