在 Pandas 中重命名列名

2024-11-21 08:33:00
admin
原创
5
摘要:问题描述:我想将 Pandas DataFrame 的列标签从['$a', '$b', '$c', '$d', '$e'] 到['a', 'b', 'c', 'd', 'e'] 解决方案 1:重命名特定列使用df.rename()函数并引用要重命名的列。并非所有列都必须重命名:df = df.rename(c...

问题描述:

我想将 Pandas DataFrame 的列标签从

['$a', '$b', '$c', '$d', '$e']

['a', 'b', 'c', 'd', 'e']

解决方案 1:

重命名特定列

使用df.rename()函数并引用要重命名的列。并非所有列都必须重命名:

df = df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'})

# Or rename the existing DataFrame (rather than creating a copy) 
df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'}, inplace=True)

最小代码示例

df = pd.DataFrame('x', index=range(3), columns=list('abcde'))
df

   a  b  c  d  e
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

以下方法均可行并产生相同的输出:

df2 = df.rename({'a': 'X', 'b': 'Y'}, axis=1)
df2 = df.rename({'a': 'X', 'b': 'Y'}, axis='columns')
df2 = df.rename(columns={'a': 'X', 'b': 'Y'}) 

df2

   X  Y  c  d  e
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

请记住将结果分配回去,因为修改不是就地的。或者,指定inplace=True

df.rename({'a': 'X', 'b': 'Y'}, axis=1, inplace=True)
df

   X  Y  c  d  e
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x
 

errors='raise'如果指定了无效的要重命名的列,您可以指定引发错误。


重新指定列标题

df.set_axis()与 一起使用axis=1

df2 = df.set_axis(['V', 'W', 'X', 'Y', 'Z'], axis=1)
df2

   V  W  X  Y  Z
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

可以直接分配标题:

df.columns = ['V', 'W', 'X', 'Y', 'Z']
df

   V  W  X  Y  Z
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

解决方案 2:

只需将其分配给.columns属性:

>>> df = pd.DataFrame({'$a':[1,2], '$b': [10,20]})
>>> df
   $a  $b
0   1  10
1   2  20

>>> df.columns = ['a', 'b']
>>> df
   a   b
0  1  10
1  2  20

解决方案 3:

rename方法可以采用函数,例如:

In [11]: df.columns
Out[11]: Index([u'$a', u'$b', u'$c', u'$d', u'$e'], dtype=object)

In [12]: df.rename(columns=lambda x: x[1:], inplace=True)

In [13]: df.columns
Out[13]: Index([u'a', u'b', u'c', u'd', u'e'], dtype=object)

解决方案 4:

如使用文本数据中所述:

df.columns = df.columns.str.replace('$', '')

解决方案 5:

Pandas 0.21+ 答案

0.21 版本中对列重命名进行了一些重大更新。

  • rename方法添加了axis可设置为columns或 的参数1。此更新使该方法与其余的 pandas API 相匹配。它仍然具有indexcolumns参数,但您不再被迫使用它们。

  • 使用设置为的方法set_axis,您可以使用列表重命名所有索引或列标签。inplace`False`

Pandas 0.21+ 的示例

构建示例 DataFrame:

df = pd.DataFrame({'$a':[1,2], '$b': [3,4], 
                   '$c':[5,6], '$d':[7,8], 
                   '$e':[9,10]})

   $a  $b  $c  $d  $e
0   1   3   5   7   9
1   2   4   6   8  10

使用renameaxis='columns'axis=1

df.rename({'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'}, axis='columns')

或者

df.rename({'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'}, axis=1)

两者的结果如下:

   a  b  c  d   e
0  1  3  5  7   9
1  2  4  6  8  10

仍然可以使用旧的方法签名:

df.rename(columns={'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'})

rename函数还接受将应用于每个列名的函数。

df.rename(lambda x: x[1:], axis='columns')

或者

df.rename(lambda x: x[1:], axis=1)

使用set_axis列表和inplace=False

set_axis您可以为该方法提供一个长度等于列数(或索引)的列表。目前,inplace默认值为True,但在未来的版本中将inplace默认为False

df.set_axis(['a', 'b', 'c', 'd', 'e'], axis='columns', inplace=False)

或者

df.set_axis(['a', 'b', 'c', 'd', 'e'], axis=1, inplace=False)

为什么不使用df.columns = ['a', 'b', 'c', 'd', 'e']

像这样直接分配列并没有什么问题。这是一个非常好的解决方案。

使用的优点set_axis是它可以用作方法链的一部分,并且它会返回 DataFrame 的新副本。如果没有它,您必须在重新分配列之前将链的中间步骤存储到另一个变量中。

# new for pandas 0.21+
df.some_method1()
  .some_method2()
  .set_axis()
  .some_method3()

# old way
df1 = df.some_method1()
        .some_method2()
df1.columns = columns
df1.some_method3()

解决方案 6:

由于您只想删除所有列名中的 $ 符号,因此您可以执行以下操作:

df = df.rename(columns=lambda x: x.replace('$', ''))

或者

df.rename(columns=lambda x: x.replace('$', ''), inplace=True)

解决方案 7:

重命名 Pandas 中的列是一项简单的任务。

df.rename(columns={'$a': 'a', '$b': 'b', '$c': 'c', '$d': 'd', '$e': 'e'}, inplace=True)

解决方案 8:

使用:

old_names = ['$a', '$b', '$c', '$d', '$e'] 
new_names = ['a', 'b', 'c', 'd', 'e']
df.rename(columns=dict(zip(old_names, new_names)), inplace=True)

这样,您就可以new_names根据需要手动编辑。当您只需要重命名几列以更正拼写错误、重音符号、删除特殊字符等时,这种方法非常有用。

解决方案 9:

单线或管道解决方案

我将重点讨论两件事:

  1. OP 明确指出

我已将编辑好的列名存储在列表中,但我不知道如何替换列名。

我不想解决如何替换'$'或删除每个列标题的第一个字符的问题。OP 已经完成了这一步。相反,我想专注于columns在给定替换列名列表的情况下用新对象替换现有对象。

  1. df.columns = new其中new,新列名称的列表非常简单。这种方法的缺点是它需要编辑现有数据框的columns属性,并且不是内联完成的。我将展示几种通过流水线执行此操作而无需编辑现有数据框的方法。


设置 1

为了重点关注使用预先存在的列表重命名或替换列名的需要,我将创建一个df具有初始列名和不相关的新列名的新示例数据框。

df = pd.DataFrame({'Jack': [1, 2], 'Mahesh': [3, 4], 'Xin': [5, 6]})
new = ['x098', 'y765', 'z432']

df

   Jack  Mahesh  Xin
0     1       3    5
1     2       4    6

解决方案 1

pd.DataFrame.rename

已经说过,如果您有一个将旧列名映射到新列名的字典,则可以使用pd.DataFrame.rename

d = {'Jack': 'x098', 'Mahesh': 'y765', 'Xin': 'z432'}
df.rename(columns=d)

   x098  y765  z432
0     1     3     5
1     2     4     6

但是,您可以轻松创建该字典并将其包含在对的调用中rename。下面利用了这样一个事实:在迭代时df,我们会迭代每个列名。

# Given just a list of new column names
df.rename(columns=dict(zip(df, new)))

   x098  y765  z432
0     1     3     5
1     2     4     6

如果您的原始列名是唯一的,则此方法很有效。但如果不是,则此方法无效。


设置 2 个

非唯一列

df = pd.DataFrame(
    [[1, 3, 5], [2, 4, 6]],
    columns=['Mahesh', 'Mahesh', 'Xin']
)
new = ['x098', 'y765', 'z432']

df

   Mahesh  Mahesh  Xin
0       1       3    5
1       2       4    6

解决方案 2

pd.concat使用keys论点

首先,请注意当我们尝试使用解决方案 1 时会发生什么:

df.rename(columns=dict(zip(df, new)))

   y765  y765  z432
0     1     3     5
1     2     4     6

我们没有将new列表映射为列名。我们最终重复了。相反,我们可以在遍历的列时y765使用函数keys的参数。pd.concat`df`

pd.concat([c for _, c in df.items()], axis=1, keys=new) 

   x098  y765  z432
0     1     3     5
1     2     4     6

解决方案 3

重建。仅当您对所有列都有一个时才应使用此方法dtype。否则,您最终会得到dtype object所有列,而将它们转换回来需要更多的字典工作。

单身的dtype

pd.DataFrame(df.values, df.index, new)

   x098  y765  z432
0     1     3     5
1     2     4     6

混合dtype

pd.DataFrame(df.values, df.index, new).astype(dict(zip(new, df.dtypes)))

   x098  y765  z432
0     1     3     5
1     2     4     6

解决方案 4这是使用和 的

花招。 允许我们内联设置索引,但没有对应的。因此我们可以转置,然后,然后再转置回来。但是,解决方案 3 中的单一与混合警告同样适用于此处。transpose`set_index**pd.DataFrame.set_index**set_columnsset_indexdtype`dtype

单身的dtype

df.T.set_index(np.asarray(new)).T

   x098  y765  z432
0     1     3     5
1     2     4     6

混合dtype

df.T.set_index(np.asarray(new)).T.astype(dict(zip(new, df.dtypes)))

   x098  y765  z432
0     1     3     5
1     2     4     6

解决方案 5

使用lambda中的pd.DataFrame.rename循环遍历 的每个元素new

在此解决方案中,我们传递一个 lambda,该 lambda 接受x但随后忽略它。它还接受y但不期望它。相反,迭代器作为默认值给出,然后我可以使用它一次循环遍历一个元素,而不管 的值是什么x

df.rename(columns=lambda x, y=iter(new): next(y))

   x098  y765  z432
0     1     3     5
1     2     4     6

正如sopython chat中的人们向我指出的那样,如果我*x和之间添加一个y,我就可以保护我的y变量。不过,在这种情况下,我认为它不需要保护。它仍然值得一提。

df.rename(columns=lambda x, *, y=iter(new): next(y))

   x098  y765  z432
0     1     3     5
1     2     4     6

解决方案 10:

列名称与系列名称

我想稍微解释一下幕后发生的事情。

数据框是一组系列。

反过来说,系列又是的延伸numpy.array

numpy.array拥有一处财产.name

这是该系列的名称。Pandas 很少尊重这个属性,但它在某些地方仍然存在,可以用来破解一些 Pandas 行为。

命名列列表

这里有很多答案都说df.columns属性是,list但实际上它是Series。这意味着它有一个.name属性。

如果您决定填写列名称,则会发生以下情况Series

df.columns = ['column_one', 'column_two']
df.columns.names = ['name of the list of columns']
df.index.names = ['name of the index']

name of the list of columns     column_one  column_two
name of the index
0                                    4           1
1                                    5           2
2                                    6           3

请注意,索引的名称始终位于低一列。

流传至今的文物

.name属性有时会持续存在。如果您设置df.columns = ['one', 'two'],则将df.one.name'one'

如果你设置df.one.name = 'three'那么df.columns仍然会给你['one', 'two'],并且df.one.name会给你'three'

pd.DataFrame(df.one)将会回归

    three
0       1
1       2
2       3

因为 Pandas 重用了.name已经定义的Series

多级列名

Pandas 有办法创建多层列名。这其中并没有太多的魔法,但我想在我的回答中也介绍一下这一点,因为我没有看到任何人在这里注意到这一点。

    |one            |
    |one      |two  |
0   |  4      |  1  |
1   |  5      |  2  |
2   |  6      |  3  |

通过将列设置为列表可以轻松实现,如下所示:

df.columns = [['one', 'one'], ['one', 'two']]

解决方案 11:

许多 pandas 函数都有一个 inplace 参数。当将其设置为 True 时,转换将直接应用于调用它的数据框。例如:

df = pd.DataFrame({'$a':[1,2], '$b': [3,4]})
df.rename(columns={'$a': 'a'}, inplace=True)
df.columns

>>> Index(['a', '$b'], dtype='object')

或者,有些情况下您希望保留原始数据框。如果创建数据框是一项昂贵的任务,我经常看到人们陷入这种情况。例如,如果创建数据框需要查询雪花数据库。在这种情况下,只需确保将 inplace 参数设置为 False。

df = pd.DataFrame({'$a':[1,2], '$b': [3,4]})
df2 = df.rename(columns={'$a': 'a'}, inplace=False)
df.columns

>>> Index(['$a', '$b'], dtype='object')

df2.columns

>>> Index(['a', '$b'], dtype='object')

如果您经常进行这些类型的转换,您还可以研究多种不同的 pandas GUI 工具。我创建了一个名为Mito的工具。这是一个电子表格,可以自动将您的编辑转换为 Python 代码。

解决方案 12:

让我们通过一个小例子来理解重命名...

  1. 使用映射重命名列:

 df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]}) # Creating a df with column name A and B
 df.rename({"A": "new_a", "B": "new_b"}, axis='columns', inplace =True) # Renaming column A with 'new_a' and B with 'new_b'

 Output:

    new_a  new_b
 0  1       4
 1  2       5
 2  3       6
  1. 使用映射重命名索引/Row_Name:

 df.rename({0: "x", 1: "y", 2: "z"}, axis='index', inplace =True) # Row name are getting replaced by 'x', 'y', and 'z'.

 Output:

        new_a  new_b
     x  1       4
     y  2       5
     z  3       6

解决方案 13:

假设这是您的数据框。

在此处输入图片描述

您可以使用两种方法重命名列。

  1. 使用dataframe.columns=[#list]

df.columns=['a','b','c','d','e']

在此处输入图片描述

此方法的局限性在于,如果必须更改一列,则必须传递完整的列列表。此外,此方法不适用于索引标签。例如,如果您传递了以下内容:

df.columns = ['a','b','c','d']

这将引发错误。长度不匹配:预期轴有 5 个元素,新值有 4 个元素。

  1. 另一种方法是 Pandasrename()方法,用于重命名任何索引、列或行

df = df.rename(columns={'$a':'a'})

在此处输入图片描述

同样,您可以更改任何行或列。

解决方案 14:

如果您已经有新列名的列表,您可以尝试以下操作:

new_cols = ['a', 'b', 'c', 'd', 'e']
new_names_map = {df.columns[i]:new_cols[i] for i in range(len(new_cols))}

df.rename(new_names_map, axis=1, inplace=True)

解决方案 15:

如果您有数据框,df.columns 会将所有内容转储到您可以操作的列表中,然后将其重新分配到数据框中作为列名......

columns = df.columns
columns = [row.replace("$", "") for row in columns]
df.rename(columns=dict(zip(columns, things)), inplace=True)
df.head() # To validate the output

最好的方法?我不知道。有方法吗?

评估问题答案中提出的所有主要技术的更好方法是使用 cProfile 来测量内存和执行时间。@kadee、@kaitlyn 和 @eumiro 拥有执行时间最快的函数 - 虽然这些函数非常快,但我们正在比较所有答案的 0.000 和 0.001 秒的舍入。寓意:我上面的答案可能不是“最佳”方法。

import pandas as pd
import cProfile, pstats, re

old_names = ['$a', '$b', '$c', '$d', '$e']
new_names = ['a', 'b', 'c', 'd', 'e']
col_dict = {'$a': 'a', '$b': 'b', '$c': 'c', '$d': 'd', '$e': 'e'}

df = pd.DataFrame({'$a':[1, 2], '$b': [10, 20], '$c': ['bleep', 'blorp'], '$d': [1, 2], '$e': ['texa$', '']})

df.head()

def eumiro(df, nn):
    df.columns = nn
    # This direct renaming approach is duplicated in methodology in several other answers:
    return df

def lexual1(df):
    return df.rename(columns=col_dict)

def lexual2(df, col_dict):
    return df.rename(columns=col_dict, inplace=True)

def Panda_Master_Hayden(df):
    return df.rename(columns=lambda x: x[1:], inplace=True)

def paulo1(df):
    return df.rename(columns=lambda x: x.replace('$', ''))

def paulo2(df):
    return df.rename(columns=lambda x: x.replace('$', ''), inplace=True)

def migloo(df, on, nn):
    return df.rename(columns=dict(zip(on, nn)), inplace=True)

def kadee(df):
    return df.columns.str.replace('$', '')

def awo(df):
    columns = df.columns
    columns = [row.replace("$", "") for row in columns]
    return df.rename(columns=dict(zip(columns, '')), inplace=True)

def kaitlyn(df):
    df.columns = [col.strip('$') for col in df.columns]
    return df

print 'eumiro'
cProfile.run('eumiro(df, new_names)')
print 'lexual1'
cProfile.run('lexual1(df)')
print 'lexual2'
cProfile.run('lexual2(df, col_dict)')
print 'andy hayden'
cProfile.run('Panda_Master_Hayden(df)')
print 'paulo1'
cProfile.run('paulo1(df)')
print 'paulo2'
cProfile.run('paulo2(df)')
print 'migloo'
cProfile.run('migloo(df, old_names, new_names)')
print 'kadee'
cProfile.run('kadee(df)')
print 'awo'
cProfile.run('awo(df)')
print 'kaitlyn'
cProfile.run('kaitlyn(df)')

解决方案 16:

df = pd.DataFrame({'$a': [1], '$b': [1], '$c': [1], '$d': [1], '$e': [1]})

如果新列表的顺序与现有列的顺序相同,则分配很简单:

new_cols = ['a', 'b', 'c', 'd', 'e']
df.columns = new_cols
>>> df
   a  b  c  d  e
0  1  1  1  1  1

如果您有一个以旧列名到新列名作为关键字的字典,则可以执行以下操作:

d = {'$a': 'a', '$b': 'b', '$c': 'c', '$d': 'd', '$e': 'e'}
df.columns = df.columns.map(lambda col: d[col])  # Or `.map(d.get)` as pointed out by @PiRSquared.
>>> df
   a  b  c  d  e
0  1  1  1  1  1

如果您没有列表或字典映射,则可以$通过列表推导去除前导符号:

df.columns = [col[1:] if col[0] == '$' else col for col in df]

解决方案 17:

df.rename(index=str, columns={'A':'a', 'B':'b'})

pandas.DataFrame.重命名

解决方案 18:

我们可以替换原始列标签的另一种方法是从原始列标签中删除不需要的字符(此处为“$”)。

这可以通过在 df.columns 上运行for循环并将剥离的列附加到 df.columns 来完成。

相反,我们可以通过使用列表推导在单个语句中巧妙地完成此操作,如下所示:

df.columns = [col.strip('$') for col in df.columns]

stripPython 中的方法从字符串的开头和结尾删除给定的字符。)

解决方案 19:

您可以使用str.slice

df.columns = df.columns.str.slice(1)

解决方案 20:

另一种选择是使用正则表达式重命名:

import pandas as pd
import re

df = pd.DataFrame({'$a':[1,2], '$b':[3,4], '$c':[5,6]})

df = df.rename(columns=lambda x: re.sub('$','',x))
>>> df
   a  b  c
0  1  3  5
1  2  4  6

解决方案 21:

我的方法是通用的,您可以通过逗号分隔变量添加额外的分隔符delimiters=并使其具有未来性。

工作代码:

import pandas as pd
import re


df = pd.DataFrame({'$a':[1,2], '$b': [3,4],'$c':[5,6], '$d': [7,8], '$e': [9,10]})

delimiters = '$'
matchPattern = '|'.join(map(re.escape, delimiters))
df.columns = [re.split(matchPattern, i)[1] for i in df.columns ]

输出:

>>> df
   $a  $b  $c  $d  $e
0   1   3   5   7   9
1   2   4   6   8  10

>>> df
   a  b  c  d   e
0  1  3  5  7   9
1  2  4  6  8  10

解决方案 22:

请注意,先前答案中的方法不适用于 MultiIndex 对于MultiIndex,您需要执行以下操作:

>>> df = pd.DataFrame({('$a','$x'):[1,2], ('$b','$y'): [3,4], ('e','f'):[5,6]})
>>> df
   $a $b  e
   $x $y  f
0  1  3  5
1  2  4  6
>>> rename = {('$a','$x'):('a','x'), ('$b','$y'):('b','y')}
>>> df.columns = pandas.MultiIndex.from_tuples([
        rename.get(item, item) for item in df.columns.tolist()])
>>> df
   a  b  e
   x  y  f
0  1  3  5
1  2  4  6

解决方案 23:

如果您必须处理提供系统命名的超出您控制范围的大量列,我想出了以下方法,该方法结合了通用方法和特定替换。

首先使用正则表达式从数据框列名创建一个字典,以便丢弃列名的某些附录,然后向字典中添加特定的替换项,以便稍后在接收数据库中按预期命名核心列。

然后将其一次性应用于数据框。

dict = dict(zip(df.columns, df.columns.str.replace('(:S$|:C1$|:L$|:D$|.Serial:L$)', '')))
dict['brand_timeseries:C1'] = 'BTS'
dict['respid:L'] = 'RespID'
dict['country:C1'] = 'CountryID'
dict['pim1:D'] = 'pim_actual'
df.rename(columns=dict, inplace=True)

解决方案 24:

如果你只想删除“$”符号,请使用以下代码

df.columns = pd.Series(df.columns.str.replace("$", ""))

解决方案 25:

除了已经提供的解决方案之外,您还可以在读取文件时替换所有列。我们可以使用namesheader=0来做到这一点。

首先,我们创建一个我们喜欢用作列名的名称列表:

import pandas as pd

ufo_cols = ['city', 'color reported', 'shape reported', 'state', 'time']
ufo.columns = ufo_cols

ufo = pd.read_csv('link to the file you are using', names = ufo_cols, header = 0)

在这种情况下,所有列名都将被替换为您列表中的名称。

解决方案 26:

我的答案是

df.columns = df_new_cols

这是最好的一个,处理时间只有原来的 1/3。

timeit比较:

df有七列。我正在尝试更改一些名称。

%timeit df.rename(columns={old_col:new_col for (old_col,new_col) in zip(df_old_cols,df_new_cols)},inplace=True)
214 µs ± 10.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit df.rename(columns=dict(zip(df_old_cols,df_new_cols)),inplace=True)
212 µs ± 7.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit df.columns = df_new_cols
72.9 µs ± 17.2 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

解决方案 27:

在特定位置重命名列

本页未提及的一个用例是如何按索引重命名列,即在特定位置重命名列名。如果列名是唯一的,则rename()可行。例如,如果我们想重命名第二列,则以下内容可行。

df = pd.DataFrame({'$A': [1, 2], '$B': ['a', 'b']})
df.rename(columns={df.columns[1]: 'new'}, inplace=True)
#                  ^^^^^^^^^^^^^ <--- second column is renamed

结果1

但是,如果列标签不唯一(这是首先按索引重命名的常见原因),则上述操作将更改所有重复的列名。但是,是一个不可变的 pandas Index 对象,它建立在(可变的)numpy ndarray 上,可以使用/pd.DataFrame().columns作为视图访问。通过索引修改底层数组即可完成此工作。.values`.to_numpy()`

# modify the second column name
df = pd.DataFrame([[1, 'a', 1.2], [2, 'b', 3.4]], columns=['$A', '$B', '$B'])
df.columns[1] = 'new'             # <---- TypeError
df.columns.values[1] = 'new'      # <---- OK
df.columns.to_numpy()[1] = 'new'  # <---- OK

要以链式方法执行相同操作或创建数据框的新副本,需要更改整个列对象并使用以下方法分配set_axis()

# change the second column name
df = df.set_axis([*df.columns[:1], 'new', *df.columns[2:]], axis=1)

结果2

str方法

pd.DataFrame().columns还定义了一个.str访问器,它使人们能够调用特定的字符串方法。对于问题中的用例,可以使用它removeprefix()来删除前导'$'s。

df = pd.DataFrame({'$A': [1, 2], '$B': ['a', 'b']})
df.columns = df.columns.str.removeprefix('$')

结果3

解决方案 28:

假设您可以使用正则表达式,则此解决方案无需使用正则表达式手动编码:

import pandas as pd
import re

srch = re.compile(r"w+")

data = pd.read_csv("CSV_FILE.csv")
cols = data.columns
new_cols = list(map(lambda v:v.group(), (list(map(srch.search, cols)))))
data.columns = new_cols

解决方案 29:

一个简单而‘有趣’(并且符合 Python 风格?)的解决方案:

df.rename(columns={x: x.replace('$', '') for x in df.columns})

在哪里:

df = pd.DataFrame(columns=['$a', '$b', '$c', '$d', '$e'])

步骤:

以列表形式获取 DataFrame 的列:

df.columns

DataFrames 中重命名的方法:

df.rename()

指定您想要重命名列的属性:

columns={}

在字典中,您需要指定要重命名的列(在每个键中)以及它们将获得哪些新名称(每个值)

{'old_col_name': 'new_col_name', ...}

由于您的更改遵循一种模式,为了删除每列中的 $ 字符,我们可以使用字典理解:

{x: x.replace('$', '') for x in df.columns}

解决方案 30:

这是一个我喜欢用来减少打字的巧妙的小功能:

def rename(data, oldnames, newname):
    if type(oldnames) == str: # Input can be a string or list of strings
        oldnames = [oldnames] # When renaming multiple columns
        newname = [newname] # Make sure you pass the corresponding list of new names
    i = 0
    for name in oldnames:
        oldvar = [c for c in data.columns if name in c]
        if len(oldvar) == 0:
            raise ValueError("Sorry, couldn't find that column in the dataset")
        if len(oldvar) > 1: # Doesn't have to be an exact match
            print("Found multiple columns that matched " + str(name) + ": ")
            for c in oldvar:
                print(str(oldvar.index(c)) + ": " + str(c))
            ind = input('Please enter the index of the column you would like to rename: ')
            oldvar = oldvar[int(ind)]
        if len(oldvar) == 1:
            oldvar = oldvar[0]
        data = data.rename(columns = {oldvar : newname[i]})
        i += 1
    return data

以下是其工作原理的一个例子:

In [2]: df = pd.DataFrame(np.random.randint(0, 10, size=(10, 4)), columns = ['col1', 'col2', 'omg', 'idk'])
# First list = existing variables
# Second list = new names for those variables
In [3]: df = rename(df, ['col', 'omg'],['first', 'ohmy'])
Found multiple columns that matched col:
0: col1
1: col2

Please enter the index of the column you would like to rename: 0

In [4]: df.columns
Out[5]: Index(['first', 'col2', 'ohmy', 'idk'], dtype='object')
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用