Переименовывать заголовки столбцов различного формата в пандах - PullRequest
0 голосов
/ 04 мая 2018

Я работаю над небольшим инструментом, который выполняет некоторые вычисления на фрейме данных, скажем, что-то вроде этого:

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 голосов
/ 04 мая 2018

Я рекомендую вам сформулировать логику преобразования и написать соответствующую функцию:

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')
0 голосов
/ 04 мая 2018

Просто

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
0 голосов
/ 04 мая 2018

Это должно решить это:

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)
0 голосов
/ 04 мая 2018

если у вас есть список других имен, таких как 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' и 'Col_A', но в противном случае он должен работать, так как rename не волнует, если какой-либо ключ в dict_rename не находится в df.columns.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...