Переименовать столбцы с похожими строками - Pandas - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть pandas df, который содержит, где первые два столбца представляют другие столбцы. Однако указанные строки c будут меняться в зависимости от входных данных. Поэтому я хочу использовать строки и заменить их на другие столбцы.

Используя df ниже, у нас есть похожие имена столбцов.

df = pd.DataFrame({ 
        'Foo_somestring' : ['X','X','X'],  
        'Bar bar_somestring' : ['X','X','X'],                               
        'GroupA_somestring' : ['X','X','X'],                   
        'GroupB_somestring' : ['X','X','X'],  
        'GroupA_some_other_string' : ['X','X','X'],                   
        'GroupB_some_other_string' : ['X','X','X'],  
                })

Предполагаемый результат:

df = pd.DataFrame({ 
        'Foo_somestring' : ['X','X','X'],  
        'Bar bar_somestring' : ['X','X','X'],                               
        'Foo_somestring' : ['X','X','X'],                   
        'Bar bar_somestring' : ['X','X','X'],  
        'Foo_some_other_string' : ['X','X','X'],                   
        'Bar bar_some_other_string' : ['X','X','X'],  
                })

I не может использовать df.rename здесь, потому что foo и bar будут переменными в том смысле, что они будет меняться в зависимости от входного набора данных. Например, первые два значения col могут быть Dog и Cat.

Мне бы пришлось вручную определить col values и затем заменить. Это становится неэффективным, если мне приходится многократно завершать процесс.

Поэтому мне нужно что-то, что не жестко запрограммировано, но занимает первые два col values.

Ответы [ 2 ]

1 голос
/ 24 февраля 2020

Вы пробовали это:

groups={'GroupA':df.columns[0].split('_')[0],'GroupB':df.columns[1].split('_')[0]}
for group in groups:
    df.columns=df.columns.str.replace(group, groups[group])
0 голосов
/ 24 февраля 2020

Не уверен, если вы хотите заменить, используя словарь, но посмотрите, будет ли это работать -

import re
df = pd.DataFrame({ 
        'Foo_somestring' : ['X','X','X'],  
        'Bar bar_somestring' : ['X','X','X'],                               
        'GroupA_somestring' : ['X','X','X'],                   
        'GroupB_somestring' : ['X','X','X'],  
        'GroupA_some_other_string' : ['X','X','X'],                   
        'GroupB_some_other_string' : ['X','X','X'],  
                })
rename_dict={'GroupA':'Foo', 'GroupB':'Bar bar'}
new_col= [re.sub('|'.join(rename_dict.keys()), lambda x: rename_dict[x.group()], i) for i in df.columns.to_list()]
df.columns = new_col
...