Как создать фрейм данных из списка на основе определенных критериев списка - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть следующий список:

['1',
 'William Dunn Moseley',
 'June 25, 1845–October 1, 1849(term limited)',
 'Democratic',
 '1845',
 'Office did not exist',
 '2',
 'Thomas Brown',
 'October 1, 1849–October 3, 1853(term limited)',
 'Whig',
 '1849',
 '3',
 'James E. Broome',
 'October 3, 1853–October 5, 1857(term limited)',
 'Democratic',
 '1853',
]

Каждое число в списке соответствует строке в наборе данных, который я хочу сгенерировать.Следовательно, из этого списка мы хотели бы создать набор данных, который выглядит примерно так:

Number         Name                            Term                              Party       Election       Office
1      'William Dunn Moseley' 'June 25, 1845–October 1, 1849(term limited)'    Democratic     1845    'Office did not exist'
2          'Thomas Brown'     'October 1, 1849–October 3, 1853(term limited)'    'Whig'      '1849'    NA
3         'James E. Broome'   'October 3, 1853–October 5, 1857(term limited)'  'Democratic'  '1853'    NA

Существует ли простой способ перевернуть список во фрейм данных на основе определенных значений или между ними, напримеркак номера строк, в списке?

Буду признателен за любую помощь, которую вы можете оказать!Большое спасибо.

Ответы [ 4 ]

1 голос
/ 27 сентября 2019

Было бы трудно сделать это со 100% точностью, потому что ваши данные нерегулярны, но вот что.

import numpy as np
import pandas as pd

number_of_presidents = 3

presidents = np.array(['1',
 'William Dunn Moseley', 'June 25, 1845–October 1, 1849(term limited)',
 'Democratic', '1845',  'Office did not exist',  '2', 'Thomas Brown',
 'October 1, 1849–October 3, 1853(term limited)', 'Whig', '1849',
 '3', 'James E. Broome', 'October 3, 1853–October 5, 1857(term limited)',
 'Democratic', '1853'])

indexes = []

for i in range(1, number_of_presidents + 1):
    indexes.append(np.where(presidents == str(i))[0][0])

df = pd.DataFrame(np.split(presidents, indexes)[1:]).iloc[:, 1:]

print(df)
    1  ...                     5

0 Уильям Данн Мозли ... Офиса не было

1 Томас Браун ... Нет

2 Джеймс Э. Брум ... Нет

[3 строки по 5 столбцов]

0 голосов
/ 27 сентября 2019

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

0 голосов
/ 27 сентября 2019

Это не имеет значения , если у двух последних президентов нет «Офиса не было».И вам не нужно знать, сколько там президентов.; D

Вы можете просто зацикливаться и разбивать их на строки, когда встречаете индекс

temp = []
output = []
idx = 0

for row in a:
    if row.isnumeric() and int(row) == idx+1:
        output.append(temp)
        temp = []
        idx += 1
        continue
    temp.append(row)

output.append(temp)
df = pandas.DataFrame(output[1:], columns=column_names)

Это даст вам то, что вы хотите.Но вы должны пометить имена столбцов.

0 голосов
/ 27 сентября 2019

сохраняя ваш список в L, вы можете сделать это следующим образом:

Сначала исправьте список.
Проверьте каждый 6-й элемент, если это число, и вставьте пустой строковый элемент, если да.Если после этого цикла длина списка кратна 6, он уже завершен, в противном случае добавьте еще одну пустую строку:

i = 5
while i < len(L):
    if L[i].isdecimal():
        L.insert(i, '')
    i += 6
if len(L)%6 != 0:
    L.append('')

С этим обычным списком создание фрейма данных легко, просто преобразуйте список в2D т.е. список подсписков и добавление имен столбцов:

import pandas as pd

values = [L[i:i+6] for i in range(0, len(L), 6)]
col = ['Number', 'Name', 'Term', 'Party', 'Election', 'Office']

df = pd.DataFrame(values, columns=col)

#   Number                  Name  ... Election                Office
# 0      1  William Dunn Moseley  ...     1845  Office did not exist                                
# 1      2          Thomas Brown  ...     1849                                                          
# 2      3       James E. Broome  ...     1853                                    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...