如何基于列表特定条件从列表创建数据框

时间:2019-09-27 19:26:33

标签: python pandas list dataframe

我有以下列表:

['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',
]

列表中的每个数字对应于我要生成的数据集中的一行。因此,id希望从此列表中生成看起来像下面的数据集:

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 个答案:

答案 0 :(得分:1)

很难做到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 William Dunn Moseley ...办公室不存在

     

1托马斯·布朗...没有

     

2 James E. Broome ...没有

     

[3行x 5列]

答案 1 :(得分:0)

将列表存储在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                                    

答案 2 :(得分:0)

最后两任总统没有“办公室不存在”,这没什么。您无需知道有多少位总统。 ; 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)

这会给您您想要的。但是您必须标记列名称。

答案 3 :(得分:0)

您可以通过遍历数组来实现此目的,方法是将i的值增加您拥有的列数并将数据保存在字典中,例如: enter image description here