我想从

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

to

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

当前回答

许多panda函数都有一个就地参数。当设置为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')

如果这些类型的转换是您经常做的,那么您还可以研究一些不同的panda GUI工具。我是一个叫做水户的人的创造者。它是一个电子表格,可以自动将您的编辑转换为python代码。

其他回答

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

它将按照您提供的顺序用您提供的名称替换现有名称。

我的单线回答是

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)

单线或管道解决方案

我将关注两件事:

OP明确规定我将编辑后的列名存储在列表中,但我不知道如何替换列名。我不想解决如何替换“$”或删除每个列标题的第一个字符的问题。OP已完成此步骤。相反,我希望集中精力在给定替换列名列表的情况下,用一个新的列对象替换现有的列对象。df.columns=new其中new是新列名称的列表,非常简单。这种方法的缺点是它需要编辑现有数据帧的columns属性,而且它不是内联的。我将展示一些通过流水线执行此操作的方法,而无需编辑现有的数据帧。


设置1为了关注用预先存在的列表重命名或替换列名的需要,我将创建一个新的示例dataframe 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

解决方案1pd.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

但是,您可以轻松地创建该字典并将其包含在重命名调用中。下面的内容利用了这样一个事实,即在对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

解决方案2pd.concat使用keys参数

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

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

   y765  y765  z432
0     1     3     5
1     2     4     6

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

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对象,并且将它们转换回需要更多的字典工作。

单个数据类型

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

   x098  y765  z432
0     1     3     5
1     2     4     6

混合数据类型

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这是一个带有转置和set_index的噱头。pd.DataFrame.set_index允许我们内联设置索引,但没有相应的set_columns。所以我们可以转置,然后设置索引,然后转置回去。然而,解决方案3中的单个数据类型与混合数据类型的警告同样适用于此。

单个数据类型

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

   x098  y765  z432
0     1     3     5
1     2     4     6

混合数据类型

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在pd.DataFrame.rename中使用循环遍历每个新元素的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

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

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

   x098  y765  z432
0     1     3     5
1     2     4     6

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

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)

假设这是您的数据帧。

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

使用dataframe.columns=[#list]df.columns=[‘a’,‘b’,‘c’,‘d’,‘e’]此方法的限制是,如果必须更改一列,则必须传递完整的列列表。此外,此方法不适用于索引标签。例如,如果您通过以下步骤:df.columns=[‘a’、‘b’、‘c’、‘d’]这将引发错误。长度不匹配:预期轴有5个元素,新值有4个元素。另一种方法是Pandasrename()方法,用于重命名任何索引、列或行df=df.rename(列={‘$a‘:‘a‘})

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