Перетаскивание фрейма данных в Pandas (Python)

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

from StringIO import StringIO import pandas as pd the_data = """ ABC,2016-6-9 0:00,95,{'//Purple': [115L], '//Yellow': [403L], '//Blue': [16L], '//White-XYZ': [0L]} ABC,2016-6-10 0:00,0,{'//Purple': [219L], '//Yellow': [381L], '//Blue': [90L], '//White-XYZ': [0L]} ABC,2016-6-11 0:00,0,{'//Purple': [817L], '//Yellow': [21L], '//Blue': [31L], '//White-XYZ': [0L]} ABC,2016-6-12 0:00,0,{'//Purple': [80L], '//Yellow': [2011L], '//Blue': [8888L], '//White-XYZ': [0L]} ABC,2016-6-13 0:00,0,{'//Purple': [32L], '//Yellow': [15L], '//Blue': [4L], '//White-XYZ': [0L]} DEF,2016-6-16 0:00,0,{'//Purple': [32L], '//Black': [15L], '//Pink': [4L], '//NPO-Green': [3L]} DEF,2016-6-17 0:00,0,{'//Purple': [32L], '//Black': [15L], '//Pink': [4L], '//NPO-Green': [0L]} DEF,2016-6-18 0:00,0,{'//Purple': [32L], '//Black': [15L], '//Pink': [4L], '//NPO-Green': [7L]} DEF,2016-6-19 0:00,0,{'//Purple': [32L], '//Black': [15L], '//Pink': [4L], '//NPO-Green': [14L]} DEF,2016-6-20 0:00,0,{'//Purple': [32L], '//Black': [15L], '//Pink': [4L], '//NPO-Green': [21L]} """ 

Я прочитал данные в кадре данных Pandas следующим образом:

 df = pd.read_csv(StringIO(the_data), sep=',', header=None) 

Поля «Компания» и «Дата» никогда не будут меняться.

Однако «ключи» внутри фигурных скобок (например, "//PurpleCar" , "//YellowCar" , "//BlueCar" , "//WhiteCar" , "//BlackCar" , "//BlackCar" и "NPO-GreenCar" ) не являются статическими . Они могут (и будут) часто меняться.

(обратите внимание: еще один скрипт, который я вывел из словаря и «создает» этот текстовый файл, следовательно, эта структура данных)

Я хотел бы, чтобы кадр данных отображался следующим образом, чтобы я мог использовать Matplotlib для создания визуализации:

  Company Date Purple Yellow Blue White-XYZ Black Pink NPO-Green 0 ABC 2016-6-9 115 403 16 0 0 0 0 1 ABC 2016-6-10 219 381 90 0 0 0 0 2 ABC 2016-6-11 817 21 31 0 0 0 0 3 ABC 2016-6-12 80 2011 8888 0 0 0 0 4 ABC 2016-6-13 32 15 4 0 0 0 0 5 DEF 2016-6-16 32 0 0 0 15 4 3 6 DEF 2016-6-17 32 0 0 0 15 4 0 7 DEF 2016-6-18 32 0 0 0 15 4 7 8 DEF 2016-6-19 32 0 0 0 15 4 14 9 DEF 2016-6-20 32 0 0 0 15 4 21 

Проблемы, с которыми я столкнулся:

a) перемещение значений «ключа» до заголовков столбцов

б) позволяя «ключевым» значениям быть динамическими (опять же, они могут и будут меняться)

c) удаление квадратных скобок ( '[' и ']' )

d) удаление двойных косых черт ( '//' )

e) удаление «L» после численного значения

Точки «c», «d» и «e» выше могут быть рассмотрены со следующей проблемой (которая связана):

Как удалить фигурные скобки, апострофы и квадратные скобки из словарей в кадре данных Pandas (Python)

Это точки «a» и «b», с которыми я борюсь.

Кто-нибудь видит способ их устранения?

Благодаря!

* ОБНОВИТЬ *

Первоначально опубликованные данные имели небольшую ошибку. Вот данные:

 the_data = """ ABC,2016-6-9 0:00,95,"{'//Purple': [115L], '//Yellow': [403L], '//Blue': [16L], '//White-XYZ': [0L]}" ABC,2016-6-10 0:00,0,"{'//Purple': [219L], '//Yellow': [381L], '//Blue': [90L], '//White-XYZ': [0L]}" ABC,2016-6-11 0:00,0,"{'//Purple': [817L], '//Yellow': [21L], '//Blue': [31L], '//White-XYZ': [0L]}" ABC,2016-6-12 0:00,0,"{'//Purple': [80L], '//Yellow': [2011L], '//Blue': [8888L], '//White-XYZ': [0L]}" ABC,2016-6-13 0:00,0,"{'//Purple': [32L], '//Yellow': [15L], '//Blue': [4L], '//White-XYZ': [0L]}" DEF,2016-6-16 0:00,0,"{'//Purple': [32L], '//Black': [15L], '//Pink': [4L], '//NPO-Green': [3L]}" DEF,2016-6-17 0:00,0,"{'//Purple': [32L], '//Black': [15L], '//Pink': [4L], '//NPO-Green': [0L]}" DEF,2016-6-18 0:00,0,"{'//Purple': [32L], '//Black': [15L], '//Pink': [4L], '//NPO-Green': [7L]}" DEF,2016-6-19 0:00,0,"{'//Purple': [32L], '//Black': [15L], '//Pink': [4L], '//NPO-Green': [14L]}" DEF,2016-6-20 0:00,0,"{'//Purple': [32L], '//Black': [15L], '//Pink': [4L], '//NPO-Green': [21L]}" """ 

Разница между этими данными и исходными данными – это апострофы (") перед открытием фигурной скобки ( "{" ) и после закрытия фигурной скобки ( "}" ).

2 Solutions collect form web for “Перетаскивание фрейма данных в Pandas (Python)”

Рассмотрим преобразование значений столбца словаря в словарях Python с использованием ast.literal_eval() а затем ast.literal_eval() их как отдельных кадров данных для окончательного слияния с исходным фреймворком данных:

 from io import StringIO import pandas as pd import ast ... df = pd.read_csv(StringIO(the_data), header=None, names=['Company', 'Date', 'Value', 'Dicts']) dfList = [] for i in df['Dicts'].tolist(): result = ast.literal_eval(i.replace('L]', ']')) result = {k.replace('//',''):v for k,v in result.items()} temp = pd.DataFrame(result) dfList.append(temp) dictdf = pd.concat(dfList).reset_index(drop=True) df = pd.merge(df, dictdf, left_index=True, right_index=True).drop(['Dicts'], axis=1) print(df) # Company Date Value Black Blue NPO-Green Pink Purple White-XYZ Yellow # 0 ABC 2016-6-9 0:00 95 NaN 16.0 NaN NaN 115 0.0 403.0 # 1 ABC 2016-6-10 0:00 0 NaN 90.0 NaN NaN 219 0.0 381.0 # 2 ABC 2016-6-11 0:00 0 NaN 31.0 NaN NaN 817 0.0 21.0 # 3 ABC 2016-6-12 0:00 0 NaN 8888.0 NaN NaN 80 0.0 2011.0 # 4 ABC 2016-6-13 0:00 0 NaN 4.0 NaN NaN 32 0.0 15.0 # 5 DEF 2016-6-16 0:00 0 15.0 NaN 3.0 4.0 32 NaN NaN # 6 DEF 2016-6-17 0:00 0 15.0 NaN 0.0 4.0 32 NaN NaN # 7 DEF 2016-6-18 0:00 0 15.0 NaN 7.0 4.0 32 NaN NaN # 8 DEF 2016-6-19 0:00 0 15.0 NaN 14.0 4.0 32 NaN NaN # 9 DEF 2016-6-20 0:00 0 15.0 NaN 21.0 4.0 32 NaN NaN 

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

 import re static_cols = [] dynamic_cols = [] for line in the_data.splitlines(): if line == '': continue # deal with static columns x = line.split(',') company, date, other = x[0:3] keys = ['Company', 'Date', 'Other'] values = [company, date, other] d = {i: j for i, j in zip(keys, values)} static_cols.append(d) # deal with dynamic columns keys = re.findall(r'(?<=//)[^\']*', line) values = re.findall(r'\d+(?=L)', line) d = {i: j for i, j in zip(keys, values)} dynamic_cols.append(d) df1 = pd.DataFrame(static_cols) df2 = pd.DataFrame(dynamic_cols) df = pd.concat([df1, df2], axis=1) 

И выход:

введите описание изображения здесь

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

  • Независимый от файловой системы способ использования glob.glob и регулярных выражений с именами файлов Unicode в Python
  • Есть ли у python re (regex) альтернатива escape-последовательностям Unicode?
  • Python RE не возвращает ничего после / ref =
  • Как использовать регулярное выражение в lxml xpath?
  • BeautifulSoup webscraping find_all (): поиск точного соответствия
  • Создайте Pandas DataFrame из txt-файла с определенным шаблоном
  • Почему это регулярное выражение приводит к четырем элементам?
  • Как исправить регулярное выражение, которое пытается поймать какое-то слово и идентификатор?
  • Заменить не буквенно-цифровые символы, за исключением некоторых исключений python
  • Получить групповое совпадение в re.sub в Python
  • Поиск и замена -. Sub (замена, строка ) - не работает со специальными символами
  • Python - лучший язык программирования в мире.