Pandas - переименовывает только первое совпадение словаря вместо последнего совпадения - PullRequest
0 голосов
/ 07 октября 2018

Я пытаюсь использовать панды для переименования столбца в файлах CSV.Я хочу использовать словарь, поскольку иногда столбцы с одинаковой информацией могут называться по-разному (например, mobile_phone и phone вместо phone).

Я хочу переименовать первый экземпляр phone.Вот пример, который мы надеемся объяснить подробнее.

Вот оригинал в этом примере:

0 name     mobile_phone     telephone
1 Bob      12364234234      12364234234
2 Joe      23534235435      43564564563
3 Jill     34573474563      78098080807

Вот что я хочу сделать:

0 name     phone            telephone
1 Bob      12364234234      12364234234
2 Joe      23534235435      43564564563
3 Jill     34573474563      78098080807

Вот код, который я попробовал:

phone_dict = {
'phone_number': 'phone',
'mobile_phone': 'phone',
'telephone': 'phone',
'phones': 'phone',
}

if 'phone' not in df.columns:
df.rename(columns=dict(phone_dict), inplace=True)
if 'phone' not in df.columns:
    raise ValueError("What are these peoples numbers!? (Need 'phone' column)")

Я создал словарь с некоторыми возможными именами столбцов и хочу, чтобы они назывались «телефон».Однако, когда я запускаю этот код, он поворачивает столбцы, чтобы изменить второй столбец вместо первого, который соответствует ключу в словаре.Я хочу, чтобы он остановился после совпадения с первым столбцом, который встречается в CSV.

Вот что происходит:

0 name     mobile_phone     phone
1 Bob      12364234234      12364234234
2 Joe      23534235435      43564564563
3 Jill     34573474563      78098080807

Если существует, например, третий столбец, которыйсоответствует словарю, который они превращают в «телефон», что опять же не то, что я хочу.Я пытаюсь заставить его просто изменить первый соответствующий столбец.

Вот пример того, что происходит, когда я добавляю третий столбец.Это идет от:

0 name     mobile_phone     telephone      phone_1
1 Bob      12364234234      12364234234    36346346311
2 Joe      23534235435      43564564563    34634634623
3 Jill     34573474563      78098080807    34634654622

К этому:

0 name     phone            phone          phone
1 Bob      12364234234      12364234234    36346346311
2 Joe      23534235435      43564564563    34634634623
3 Jill     34573474563      78098080807    34634654622

Но я хочу, чтобы это было так:

0 name     phone            telephone      phone_1
1 Bob      12364234234      12364234234    36346346311
2 Joe      23534235435      43564564563    34634634623
3 Jill     34573474563      78098080807    34634654622

Любые советы или подсказки, чтобы остановить его второйизменить второе совпадение словаря вместо первого или всех из них?

До того, как у меня появилась куча утверждений elif, но я думал, что словарь будет чище и легче для чтения.

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Вы не должны ожидать, что pd.DataFrame.rename применит какой-либо конкретный последовательный порядок с входом dict.Даже если бы логика работала, это была бы деталь реализации, поскольку документы не описывают фактический процесс.

Вместо этого вы можете использовать pd.DataFrame.filter, чтобы найти первую действительную метку столбца:

df = df.rename(columns={df.filter(like='phone').columns[0]: 'phone'})

print(df)

   0  name        phone    telephone
0  1   Bob  12364234234  12364234234
1  2   Joe  23534235435  43564564563
2  3  Jill  34573474563  78098080807

Если возможно, допустимый столбец может не существовать, вы можете поймать IndexError:

try:
    df = df.rename(columns={df.filter(like='phones').columns[0]: 'phone'})
except IndexError:
    print('No columns including "phones" exists.')
0 голосов
/ 07 октября 2018

Вот одно из решений:

df:

Columns: [name, mobile_phone, telephone]
Index: []

Поиск первого экземпляра телефона (слева направо) в индексе столбца:

a = [True if ('phone' in df.columns[i]) & ('phone' not in df.columns[i-1]) else False for i in range(len(df.columns))]

Получение столбца, который необходимо переименовать phone:

 phonecol = df.columns[a][0]

Переименование столбца:

df.rename(columns = {phonecol : 'phone'})

Вывод:

Columns: [name, phone, telephone]
Index: []
...