Список списков для словаря панды DataFrame - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь вписать эти данные:

[['Manufacturer: Hyundai',
  'Model: Tucson',
  'Mileage: 258000 km',
  'Registered: 07/2019'],
 ['Manufacturer: Mazda',
  'Model: 6',
  'Year: 2014',
  'Registered: 07/2019']]

в панды DataFrame.

Не все метки присутствуют в каждой записи, например, некоторые записи имеют «Пробег», а другие нет, и наоборот.У меня в общей сложности 26 функций, и очень немногие элементы имеют все из них.

Я хотел бы создать панду DataFrame, которая будет содержать объекты в столбцах, и если объект не существует, то контент должен быть 'NaN'.

У меня есть

colnames=['Manufacturer', 'Model', 'Mileage', 'Registered', 'Year'...(all 26 features here)] 
df = pd.read_csv("./data/output.csv", sep=",", names=colnames, header=None)

Немногие первые обязательные столбцы дают ожидаемый результат, но когда дело доходит до дополнительных функций, чем пропущенные данные приводят к тому, что объекты появляются после неправильных столбцов.Записи отображаются правильно, только если присутствуют все функции.

Я забыл упомянуть, что некоторые функции, у которых отсутствует значение, также не имеют ":", но присутствуют в списке.Таким образом, в этих 2 случаях:

  • «Пробег», (значение отсутствует, но также отсутствует «:»)
  • отсутствует «Пробег» из записи альтогетера

назначение для обоих случаев должно быть 'NaN'.

1 Ответ

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

Использовать понимание вложенного списка для списка словарей и передавать в конструктор DataFrame, если добавлен тот же ключ NaN:

L = [['Manufacturer: Hyundai',
  'Model: Tucson',
  'Mileage: 258000 km',
  'Registered: 07/2019'],
 ['Manufacturer: Mazda',
  'Model: 6',
  'Year: 2014',
  'Registered: 07/2019']]

df = pd.DataFrame([dict(y.split(':') for y in x) for x in L])
print (df)
  Manufacturer     Mileage    Model Registered   Year
0      Hyundai   258000 km   Tucson    07/2019    NaN
1        Mazda         NaN        6    07/2019   2014

РЕДАКТИРОВАТЬ: Вы можете использовать .split(maxsplit=1) для разделения напервый пробел:

L = [['Manufacturer Hyundai',
  'Model Tucson',
  'Mileage 258000 km',
  'Registered 07/2019'],
 ['Manufacturer Mazda',
  'Model 6',
  'Year 2014',
  'Registered 07/2019']]


df = pd.DataFrame([dict(y.split(maxsplit=1) for y in x) for x in L])
print (df)

  Manufacturer    Mileage   Model Registered  Year
0      Hyundai  258000 km  Tucson    07/2019   NaN
1        Mazda        NaN       6    07/2019  2014

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

L = [['Manufacturer  Hyundai',
  'Model  Tucson',
  'Mileage  258000 km',
  'Registered  07/2019'],
 ['Manufacturer  Mazda',
  'Model  6',
  'Year  2014',
  'Registered  07/2019',
  'Additional equipment aaa']]

words2 = ['Additional equipment']

L1 = []
for x in L:
    di = {}
    for y in x:
        for word in words2:
            if set(word.split(maxsplit=2)[:2]) < set(y.split()):
                i, j, k = y.split(maxsplit=2)
                di['_'.join([i, j])] = k
            else:
                i, j = y.split(maxsplit=1)
                di[i] = j
    L1.append(di)

df = pd.DataFrame(L1)
print (df)
  Additional_equipment Manufacturer    Mileage   Model Registered  Year
0                  NaN      Hyundai  258000 km  Tucson    07/2019   NaN
1                  aaa        Mazda        NaN       6    07/2019  2014
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...