在pandas中重命名各种格式的列标题

时间:2018-05-04 14:30:43

标签: python pandas dataframe

我正在研究一种在数据框上进行一些计算的小工具,让我们这样说:

df['column_c'] = df['column_a'] + df['column_b']

要使其工作,数据框需要包含列'column_a'和'column_b'。如果在导入文件(csv或xlsx)中命名的列略有不同,我希望此代码能够正常工作。例如'columnA','Col_a'等。

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

if column name is in list ['columnA', 'Col_A', 'col_a', 'a'... ] rename it to 'column_a'

我正在考虑使用包含可能列名的字典,当列名将在此字典中时,它将重命名为“column_a”。另一个复杂因素是列可以按任意顺序排列。

如何解决这个问题?

4 个答案:

答案 0 :(得分:2)

我建议你制定转换逻辑并相应地编写一个函数:

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 = df.rename(columns=converter)

使用示例:

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')

答案 1 :(得分:1)

如果您有list_othername_Alist_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'和' Col_A'但除此之外,它应该有效rename并不关心dict_rename中的任何键是否在df.columns中。

答案 2 :(得分:1)

简单地

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

答案 3 :(得分: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)