Удалить одинаковые элементы из нескольких столбцов в Python - PullRequest
0 голосов
/ 23 апреля 2020

Я использую Python, и у меня есть несколько столбцов, в которые добавлено несколько символов.

Так, если столбец когда-то был "A", то теперь он говорит "('A', '')". Поэтому мне нужно удалить ('и', ''). Некоторые переменные (точнее 400) должны были называться «1 А», но называются «(« А », 1)». Поэтому для этого мне нужно удалить ('и',) и переместить число в начало A. Они стали такими после команды pivot_table.

Так что мне нужно go от до до:

data_before = {"('A', '')" : ['a', 'b', 'c'],
               "('B', '')" : ['p', 'o', 'n'],
               "('C', 1)"  : [1, 1, 1], 
               "('C', 2)"  : [1, 2, 1], 
               "('D', 1)"  : [1, 2, 4],
               "('D', 2)"  : [1, 5, 3]}

df = pd.DataFrame(data=data_before)

data_after = {'A'    : ['a', 'b', 'c'],
              'B'    : ['p', 'o', 'n'],
              '1 C'  : [1, 1, 1], 
              '2 C'  : [1, 2, 1], 
              '1 D'  : [1, 2, 4],
              '2 D'  : [1, 5, 3]}

df_2 = pd.DataFrame(data=data_after)

Имейте в виду, что есть 42 переменные, которые выглядят как C и D, и каждая из них go из От 1 до 10 (не только 2), таким образом, есть 420 столбцов. Я не хочу записывать каждый из них вручную, чтобы изменить имя. Только 3 первые переменные выглядят как А и В. (всего 423 столбца).

Обновление для размещения большего количества букв и цифр. Итак 1 C, 2 C ... 10 C и 1 Z, 2 Z ... 10 Z.

data_before = {"('A', '')" : ['a', 'b', 'c'],
               "('B', '')" : ['p', 'o', 'n'],
               "('C', 1)"  : [1, 1, 1], 
               "('C', 2)"  : [1, 2, 1], 
               "('C', 3)"  : [3, 2, 1], 
               "('D', 1)"  : [1, 2, 3],
               "('D', 2)"  : [1, 2, 3],
               "('D', 3)"  : [1, 2, 3],
               "('E', 1)"  : [1, 1, 1], 
               "('E', 2)"  : [1, 2, 1], 
               "('E', 3)"  : [3, 2, 1]}

df = pd.DataFrame(data=data_before)

data_after = {'A'    : ['a', 'b', 'c'],
              'B'    : ['p', 'o', 'n'],
              '1 C'  : [1, 1, 1], 
              '2 C'  : [1, 2, 1], 
              '3 C'  : [3, 2, 1], 
              '1 D'  : [1, 2, 3], 
              '2 D'  : [1, 2, 3],
              '3 D'  : [1, 2, 3]
              '1 E'  : [1, 1, 1], 
              '2 E'  : [1, 2, 1],
              '3 E'  : [3, 2, 1]}

df_2 = pd.DataFrame(data=data_after)

Эта команда:

df.columns = [f'{b} {a}'.strip() for a, b in df.columns]

Возвращает:

ValueError: too many values to unpack (expected 2)

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Если есть кортежи или возможно MultiIndex, используйте f-strings с strip:

data_before = {('A', '') : ['a', 'b', 'c'],
               ('B', '') : ['p', 'o', 'n'],
               ('C', 1) : [1, 1, 1], 
               ('C', 2)  : [1, 2, 1], 
               ('D', 1)  : [1, 2, np.NaN],
               ('D', 2)  : [1, np.NaN, 3]}

df = pd.DataFrame(data=data_before)

df.columns = [f'{b} {a}'.strip() for a, b in df.columns]
print (df)
   A  B  1 C  2 C  1 D  2 D
0  a  p    1    1  1.0  1.0
1  b  o    1    2  2.0  NaN
2  c  n    1    1  NaN  3.0

РЕДАКТИРОВАТЬ:

import ast

df.columns = [f'{b} {a}'.strip() for a, b in df.columns.map(ast.literal_eval)]

print (df)
   A  B  1 C  2 C  3 C  1 D  2 D  3 D  1 E  2 E  3 E
0  a  p    1    1    3    1    1    1    1    1    3
1  b  o    1    2    2    2    2    2    1    2    2
2  c  n    1    1    1    3    3    3    1    1    1
0 голосов
/ 23 апреля 2020

Вам просто нужно сначала удалить все ненужные символы, а затем разделить и перевернуть строку.

import re 
df.columns = [" ".join(reversed(re.sub(r"\)|\(|'|,", "", x).split()))
              for x in df.columns]
...