我希望所有列都采用统一的命名方式,例如:
Last Name -> LAST_NAME
e-mail -> E_MAIL
ZIP code 2 -> ZIP_CODE_2
为此,我编写了一个函数,将所有符号大写,保留数字,并将其余字符替换为下划线('_'
)。然后将多个下划线替换为一个下划线,并修剪两端的下划线。如何将此函数(lambda)应用于 Pandas 中的列名?
通过调用向量化的str
方法,您可以在不使用apply
的情况下完成此操作:
In [62]:
df = pd.DataFrame(columns=['Last Name','e-mail','ZIP code 2'])
df.columns
Out[62]:
Index(['Last Name', 'e-mail', 'ZIP code 2'], dtype='object')
In [63]:
df.columns = df.columns.str.upper().str.replace(' ','_')
df.columns
Out[63]:
Index(['LAST_NAME', 'E-MAIL', 'ZIP_CODE_2'], dtype='object')
否则,您可以使用to_series
将Index
对象转换为Series
,以便您可以使用apply
:
In [67]:
def func(x):
return x.upper().replace(' ','_')
df.columns = df.columns.to_series().apply(func)
df
Out[67]:
Empty DataFrame
Columns: [LAST_NAME, E-MAIL, ZIP_CODE_2]
Index: []
感谢 @PaulH 建议使用带有 lambda
的 rename
:
In [68]:
df.rename(columns=lambda c: c.upper().replace(' ','_'), inplace=True)
df.columns
Out[68]:
Index(['LAST_NAME', 'E-MAIL', 'ZIP_CODE_2'], dtype='object')
您可以简单地设置数据框的.columns
属性。因此,要重命名它,您可以使用以下代码:
df.columns = list(map(<b>yourlambda</b>,df.columns))
当然,你需要用你的lambda表达式替换yourlambda
。
df.columns = [col[0:6] for col in df.columns]
df.columns = [myfunc(col) for col in df.columns]
- Idiot Tom