Перетаскивание фрейма данных в 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) 

И выход:

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

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

  • Использование целых чисел / дат в качестве терминалов в парсере NLTK
  • Django url pattern regex, чтобы передать электронное письмо в качестве параметра в URL-адресе
  • Импортирование ошибочно конкатенированных JSON в python
  • Pandas MultiIndex из регулярного выражения на столбце
  • regex: заменить дефисы на en-dashes с re.sub
  • Regex для соответствия Domain.CCTLD
  • Шаблон URL-адреса Django для целых чисел
  • re.compile не соответствует моей строке
  •  
    Interesting Posts for Van-Lav

    Как скомпилировать проект Visual Studio из командной строки?

    Почему я получаю ImportError: нет модуля с именем «PIL»?

    Пользовательская регистрация ведет к IntegrityError

    В чем разница между «функцией», «методом» и «связанным методом» в Python 3?

    Неподдерживаемые символы ввода

    Получить переменную из запущенной программы

    Используйте ConfigParser для чтения массива из ini-файла

    рекурсивный доступ к словарю и модификация

    Использование Python для замены MATLAB: как импортировать данные?

    SymPy – произвольное количество символов

    pyplot / matplotlib Гистограмма с цветом заливки в зависимости от значения

    Как синхронизировать полосы прокрутки двух сеток в wx

    Как понять символ равенства «=» в тексте электронной почты IMAP?

    Последовательные вызовы подпроцесса Python с adb

    самый простой способ в R или Python добавить изображение / видео в маркер графического графика click popup / infowindow

    Python - лучший язык программирования в мире.