我有一个熊猫数据框,其中有几列我想重命名。
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 |
+------+--------------------------+--------------------------+--------------------------+
有没有办法使用循环来做到这一点?
答案 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