Колонна дупе переименовывается в панд - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть следующий файл данных csv:

id,number,id
132605,1,1
132750,2,1

Панды в настоящее время переименовывают это в:

       id number id.1
0  132605      1    1
1  132750      2    1

Есть ли способ настроить, как это переименовывается?Например, я бы предпочел:

           id number id2
0  132605      1    1
1  132750      2    1

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Краткий ответ

Нет.Вы не можете изменить способ добавления суффикса с помощью pandas API.

Длинный ответ

Это обрабатывается с помощью опции pandas.read_csv mangle_dupe_cols,отключение которого в данный момент не поддерживается.

Что вы можете сделать, это изменить исходный код pandas.io.parsers._maybe_dedup_names, но, как всегда, это не очень рекомендуется.

def _maybe_dedup_names(self, names):
    if self.mangle_dupe_cols:
        names = list(names)  
        # counts = defaultdict(int)
        counts = defaultdict(lambda:1) 
        # So that your duplicated column suffix starts with 2 not 1
        is_potential_mi = _is_potential_multi_index(names)

        for i, col in enumerate(names):
            cur_count = counts[col]

            while cur_count > 0:
                counts[col] = cur_count + 1

                if is_potential_mi:
                    # col = col[:-1] + ('%s.%d' % (col[-1], cur_count),)
                    col = col[:-1] + ('%s%d' % (col[-1], cur_count),)
                else:
                    # col = '%s.%d' % (col, cur_count)
                    col = '%s%d' % (col, cur_count)
                # eliminate '.' from formating
                cur_count = counts[col]

            names[i] = col
            counts[col] = cur_count + 1
0 голосов
/ 27 декабря 2018

rename: использовать разделитель периодов

Предполагая, что повторяющиеся метки столбцов являются только случаями, когда имя столбца содержит точку (.), пользовательскую функцию можно использовать сpd.DataFrame.rename:

from io import StringIO

file = """id,number,id
132605,1,1
132750,2,1"""

def rename_func(x):
    if '.' not in x:
        return x
    name, num = x.split('.')
    return f'{name}{int(num)+1}'

# replace StringIO(file) with 'file.csv'
df = pd.read_csv(StringIO(file))\
       .rename(columns=rename_func)

print(df)

       id  number  id2
0  132605       1    1
1  132750       2    1

csv.reader: надежное решение

Возможно надежное решение с модулем csv из стандартной библиотеки:

from collections import defaultdict
import csv

# replace StringIO(file) with open('file.csv', 'r')
with StringIO(file) as fin:
    headers = next(csv.reader(fin))

def rename_duplicates(original_cols):
    count = defaultdict(int)
    for x in original_cols:
        count[x] += 1
        yield f'{x}{count[x]}' if count[x] > 1 else x

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