Python 重命名pandas中不同格式的列标题

Python 重命名pandas中不同格式的列标题,python,pandas,dataframe,Python,Pandas,Dataframe,我正在开发一个小工具,可以对数据帧进行一些计算,比如: df['column_c'] = df['column_a'] + df['column_b'] if column name is in list ['columnA', 'Col_A', 'col_a', 'a'... ] rename it to 'column_a' 为此,数据帧需要有“column_a”和“column_b”列。如果在导入文件csv或xlsx中列的名称稍有不同,我希望此代码能够正常工作。例如“columnA”、

我正在开发一个小工具,可以对数据帧进行一些计算,比如:

df['column_c'] = df['column_a'] + df['column_b']
if column name is in list ['columnA', 'Col_A', 'col_a', 'a'... ] rename it to 'column_a'
为此,数据帧需要有“column_a”和“column_b”列。如果在导入文件csv或xlsx中列的名称稍有不同,我希望此代码能够正常工作。例如“columnA”、“Colu_a”等

最简单的方法是重命名导入文件中的列,但假设这是不可能的。因此,我想做一些这样的思考:

df['column_c'] = df['column_a'] + df['column_b']
if column name is in list ['columnA', 'Col_A', 'col_a', 'a'... ] rename it to 'column_a'
我在考虑有一个可能有列名的词典,当一个列名出现在这本词典中时,它将被重命名为“column_a”。另一个复杂因素是,列可以按任意顺序排列


如何解决这个问题?

如果您有其他名称的列表,如list\u othername\u A或list\u othername\u B,您可以执行以下操作:

for col_name in df.columns:
    if col_name in list_othername_A:
        df = df.rename(columns = {col_name : 'column_a'})
    elif col_name in list_othername_B:
        df = df.rename(columns = {col_name : 'column_b'})
    elif ...
编辑:使用@djangoliv字典,您可以做得更短:

dico = {'column_a':['columnA', 'Col_A', 'col_a' ], 'column_b':['columnB', 'Col_B', 'col_b' ]}
#create a dict to rename, kind of reverse dico:
dict_rename = {col:key for key in dico.keys() for col in dico[key]}
# then just rename:
df = df.rename(columns = dict_rename )

请注意,如果在df中有两列“columnA”和“Column_A”,则此方法不起作用,但如果在df.columns中没有dict_rename中的任何键,则应将其用作rename。

如果您有其他名称列表,如list_othername_A或list_othername_B,则可以执行以下操作:

for col_name in df.columns:
    if col_name in list_othername_A:
        df = df.rename(columns = {col_name : 'column_a'})
    elif col_name in list_othername_B:
        df = df.rename(columns = {col_name : 'column_b'})
    elif ...
编辑:使用@djangoliv字典,您可以做得更短:

dico = {'column_a':['columnA', 'Col_A', 'col_a' ], 'column_b':['columnB', 'Col_B', 'col_b' ]}
#create a dict to rename, kind of reverse dico:
dict_rename = {col:key for key in dico.keys() for col in dico[key]}
# then just rename:
df = df.rename(columns = dict_rename )
请注意,如果在df中有两列“columnA”和“Column_A”,则此方法不起作用,但如果在df.columns中没有dict_rename中的任何键,则应将其作为rename来使用。

for index, column_name in enumerate(df.columns):
    if column_name in ['columnA', 'Col_A', 'col_a' ]:
        df.columns[index] = 'column_a'
用字典

dico = {'column_a':['columnA', 'Col_A', 'col_a' ], 'column_b':['columnB', 'Col_B', 'col_b' ]}
for index, column_name in enumerate(df.columns):
    for name, ex_names in dico:
        if column_name in ex_names:
            df.columns[index] = name
简单地

用字典

dico = {'column_a':['columnA', 'Col_A', 'col_a' ], 'column_b':['columnB', 'Col_B', 'col_b' ]}
for index, column_name in enumerate(df.columns):
    for name, ex_names in dico:
        if column_name in ex_names:
            df.columns[index] = name
这应该解决这个问题:

df=pd.DataFrame({'colA':[1,2], 'columnB':[3,4]})
def rename_df(col):
    if col in ['columnA', 'Col_A', 'colA' ]:
        return 'column_a'
    if col in ['columnB', 'Col_B', 'colB' ]:
        return 'column_b'
    return col
df = df.rename(rename_df, axis=1)
这应该解决这个问题:

df=pd.DataFrame({'colA':[1,2], 'columnB':[3,4]})
def rename_df(col):
    if col in ['columnA', 'Col_A', 'colA' ]:
        return 'column_a'
    if col in ['columnB', 'Col_B', 'colB' ]:
        return 'column_b'
    return col
df = df.rename(rename_df, axis=1)

我建议您制定转换逻辑并编写相应的函数:

lst = ['columnA', 'Col_A', 'col_a', 'a']

def converter(x):
    return 'column_'+x[-1].lower()

res = list(map(converter, lst))

['column_a', 'column_a', 'column_a', 'column_a']
然后,您可以直接在pd.DataFrame.rename中使用此选项:

用法示例:

df = pd.DataFrame(columns=['columnA', 'col_B', 'c'])
df = df.rename(columns=converter)

print(df.columns)

Index(['column_a', 'column_b', 'column_c'], dtype='object')

我建议您制定转换逻辑并编写相应的函数:

lst = ['columnA', 'Col_A', 'col_a', 'a']

def converter(x):
    return 'column_'+x[-1].lower()

res = list(map(converter, lst))

['column_a', 'column_a', 'column_a', 'column_a']
然后,您可以直接在pd.DataFrame.rename中使用此选项:

用法示例:

df = pd.DataFrame(columns=['columnA', 'col_B', 'c'])
df = df.rename(columns=converter)

print(df.columns)

Index(['column_a', 'column_b', 'column_c'], dtype='object')

编辑我的问题使其更清晰编辑我的问题使其更清晰是的,我可以看到这项工作,这将有助于一次重命名一列。但不是为了在一个列上重命名多个列,对吗?@XanderMJ现在看到几个名称列表是的,我可以看到这项工作,这将用于一次重命名一列。但不是为了在一个栏中重命名多个栏,对吗?@XanderMJ现在看到几个名称列表这看起来像是一个简洁的解决方案,正是我想要的,谢谢!这看起来是一个简洁紧凑的解决方案,正是我想要的,谢谢!