如何遍历熊猫数据框并重命名所有列?

时间:2020-08-03 16:06:34

标签: python pandas

我有一个熊猫数据框,其中有几列我想重命名。

odeint

我想重命名第一列之后的所有列。将('Active','03 / 22/2020')更改为Active_20200322,依此类推。这就是我希望最终输出为:

+------+--------------------------+--------------------------+--------------------------+
| FIPS | ('Active', '03/22/2020') | ('Active', '03/23/2020') | ('Active', '03/25/2020') |
+------+--------------------------+--------------------------+--------------------------+
| 1001 |                        1 |                        4 |                        8 |
| 1003 |                        4 |                        6 |                        9 |
| 1005 |                        6 |                        8 |                        9 |
+------+--------------------------+--------------------------+--------------------------+

有没有办法使用循环来做到这一点?

2 个答案:

答案 0 :(得分:1)

一种解决方案是编写一个函数来修复列名。然后,您可以创建dict理解并将其传递给DataFrame.rename进行修复。例如,类似:

import pandas as pd
import re
from datetime import datetime

def fix_column_name(val):
    if 'Active' in val:
        val = re.sub(r'[\(\)\']', '', val)
        s1, s2 = re.split(',\s*', val)
        s2 = datetime.strptime(s2, '%m/%d/%Y')
        return f'{s1}_{s2.strftime("%Y%m%d")}'
    return val

# Setup
df = pd.DataFrame({'FIPS': [1001, 1003, 1005],
 "('Active', '03/22/2020')": [1, 4, 6],
 "('Active', '03/23/2020')": [4, 6, 8],
 "('Active', '03/25/2020')": [8, 9, 9]})

print(df)

[出]

   FIPS  ('Active', '03/22/2020')  ('Active', '03/23/2020')  ('Active', '03/25/2020')
0  1001                         1                         4                         8
1  1003                         4                         6                         9
2  1005                         6                         8                         9

d = {c:fix_column_name(c) for c in df.columns}

df = df.rename(d, axis=1)

print(df)

[出]

   FIPS  Active_20200322  Active_20200323  Active_20200325
0  1001                1                4                8
1  1003                4                6                9
2  1005                6                8                9

答案 1 :(得分:1)

Index.map与自定义mapper函数一起使用,该函数将输入arg作为列名,并根据指定的要求映射此名称:

import re 

def mapper(c):
    m = re.search(r"\('([^']+).*?'([^']+)'\)", c)
    return "{0}_{3}{1}{2}".format(m.group(1), *m.group(2).split('/')) if m else c

df.columns = df.columns.map(mapper)

结果:

   FIPS  Active_20200322  Active_20200323  Active_20200325
0  1001                1                4                8
1  1003                4                6                9
2  1005                6                8                9