Pandas:有效地对列名进行大量修改

RDJ*_*RDJ 4 python pandas

如何对数据框列进行大量修改以避免样板代码.

可重复的例子:

data = {'Subject Id': ['1', '2', '3'],
        'First-Name': ['Alex', 'Amy', 'Allen'], 
        'Last, name': ['Anderson', 'Ackerman', 'Ali']}

df = pd.DataFrame(data, columns = ['Subject Id', 'First-Name', 'Last, name'])
Run Code Online (Sandbox Code Playgroud)

df

    Subject Id  First-Name  Last, name
0   1           Alex        Anderson
1   2           Amy         Ackerman
2   3           Allen       Ali
Run Code Online (Sandbox Code Playgroud)

要清理列名,我通常会这样做:

df.columns = [l.lower() for l in df.columns]
df.columns = [s.replace('-', ' ') for s in df.columns]
df.columns = [d.replace(',', ' ') for d in df.columns]
Run Code Online (Sandbox Code Playgroud)

但有时候我需要进行3次以上的修改.有没有办法将这些操作链接在一起或以其他方式更有效地执行此操作?

EdC*_*ica 5

你可以调用vectorised .str方法并在列上链接这些调用,这里我们使用str.lowerstr.replace:

In [91]:
df.columns = df.columns.str.lower().str.replace('-|,', ' ')
df

Out[91]:
  subject id first name last  name
0          1       Alex   Anderson
1          2        Amy   Ackerman
2          3      Allen        Ali
Run Code Online (Sandbox Code Playgroud)

另请注意,没有什么能阻止您将单个列表理解中的所有内容组合在一起:

In [93]:
df.columns = [l.lower().replace('-', ' ').replace(',',' ') for l in df.columns]
df

Out[93]:
  subject id first name last  name
0          1       Alex   Anderson
1          2        Amy   Ackerman
2          3      Allen        Ali
Run Code Online (Sandbox Code Playgroud)

列表理解可能会在如此少量的列上更快:

计时

In [96]:
%timeit [l.lower().replace('-', ' ').replace(',',' ') for l in df.columns]
%timeit df.columns.str.lower().str.replace('-|,', ' ')

100000 loops, best of 3: 5.26 µs per loop
1000 loops, best of 3: 284 µs per loop
Run Code Online (Sandbox Code Playgroud)