Автоматический ведущий ноль для тех же имен столбцов в Python - PullRequest
0 голосов
/ 12 ноября 2018

Я прочитал CSV с более чем 300 столбцами.Многие столбцы имеют схожие имена.
Сокращенный пример из csv:

index   d     c     a     b     b     a     a     a
0       data  data  data  data  data  data  data  data

Python автоматически добавляет числа в конце имен столбцов (если они похожи) в качестве суффикса, чтобы каждый столбец имел уникальныйname.
Пример:

index   d     c     a     b     b.1   a.1   a.2   a.3
0       data  data  data  data  data  data  data  data

Мое назначение - отсортировать столбцы по алфавиту и добавить к суффиксу нули (начальные нули).
Желаемый вывод :

index   a     a.01  a.02  a.03  b     b.01  c     d
0       data  data  data  data  data  data  data  data

Мой код ниже (взят из stackoverflow) может сортировать столбец.Но я понятия не имею, как сделать суффикс с ведущими нулями?

import pandas as pd
df= pd.read_csv(r"C:\Users\.....\file.csv", skipinitialspace=False, sep=';', header= 0, index_col = 'DateTime', low_memory=False)

df = df.sort_index(axis=1) # sort the column
pd.set_option('display.max_columns', None) # view all columns without truncated

Есть идеи?

Отредактированный вопрос
После сортировки столбцов, я хочу,

a.01 a02 a12

вместо

a.01 a.012 a.02

Ответы [ 4 ]

0 голосов
/ 12 ноября 2018

С df.columns.str

Ответы опубликованы, но хотелось бы добавить еще одно простое решение:

Поскольку df.columns является объектом индекса, мыможно использовать аксессор .str.

Вот он, Док Защитный док

Просто короткий смоделированный пример:

>>> df
    b.1   a.1   a.2
0  data  data  data
1  data  data  data

Замените нужные столбцы непосредственно в DataFrame следующим образом:

>>> df.columns = df.columns.str.replace('.','.0')
>>> df
   b.01  a.01  a.02
0  data  data  data
1  data  data  data

ИЛИ ниже уже задано, но лучше использовать inplace=True вместо присвоения df.

df.rename(columns=lambda x: x.replace('.','.0'), inplace=True)

Другой способ использованияось:

df.rename(lambda x: x.replace('.','.0'), axis='columns', inplace=True)
print(df)
   b.01  a.01  a.02
0  data  data  data
1  data  data  data
0 голосов
/ 12 ноября 2018

rename

def f(x):
  a, *b = x.rsplit('.', 1)

  return f"{a}.{int(b[0]):02d}" if b else a

df.rename(columns=f).sort_index(1)

          a  a.01  a.02  a.03     b  b.01     c     d
index                                                
0      data  data  data  data  data  data  data  data
0 голосов
/ 12 ноября 2018

Использование форматирования строки и, в основном, кода одной строки:

import pandas as pd

df = pd.DataFrame( [["data", "data", "data", "data", "data", "data", "data", "data"], 
                    ["data", "data", "data", "data", "data", "data", "data", "data"]], 
                   columns=["a", "a.1", "a.2", "a.3", "b", "b.1", "c", "d"])

df.columns = [c.replace(c[c.find(".")+1], format(int(c[c.find(".")+1]),'02') if "." in c else c) for c in df.columns]

print(df) 

Out:

      a  a.01  a.02  a.03     b  b.01     c     d
0  data  data  data  data  data  data  data  data
1  data  data  data  data  data  data  data  data
0 голосов
/ 12 ноября 2018

Вы можете сделать это следующим образом:

import re
df = df.rename(columns=lambda x: re.sub('\.','.0',x))

или

df = df.rename(columns=lambda x: x.replace('.','.0'))

Выход:

      a  a.01  a.02  a.03     b  b.01     c     d
0  data  data  data  data  data  data  data  data

Или другой вариант, в котором вы можете определить числоиз ведущих нулей:

df = df.rename(columns=lambda x: x.split('.')[0] + '.' + x.split('.')[1].zfill(2) if '.' in x else x)

С этим последним параметром, если имя столбца b.10, оно не будет изменено.

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