【问题标题】:Converting a list of dictionary-like objects containing repeated variable names and variable values to a Pandas dataframe将包含重复变量名称和变量值的类字典对象列表转换为 Pandas 数据框
【发布时间】:2022-01-02 09:44:57
【问题描述】:

我希望将 this PDF document of salaries at Oregon State University 中的数据转换为 pandas 数据框。如您所见,在文档中,结构是这样的:将成为变量名的内容在整个文档中重复出现,后跟冒号和每个观察值的列值。我已经使用 PDFBox 提取了本文档的每一行,并且能够清理内容,以便它们最终出现在如下示例的元组列表中。我想做的基本事情是获取这个元组列表,其中变量名称重复出现在元组的第一个元素和第二个元素中的变量值,并将其转换为数据框,其中这些值都在正确的对应的列。

data = ## Heading ##[('Name', ' Abbas, Houssam'),
     ('First Hired', ' 31-DEC-2018'),
     ('Home Orgn', ' ESE - Sch Elect Engr/Comp Sci'),
     ('Adj Service Date', ' 31-DEC-2018'),
     ('Job Orgn', ' ESE - Sch Elect Engr/Comp Sci'),
     ('Job Type', ' P'),
     ('Job Title', ' Assistant Professor'),
     ('Posn-Suff', ' C18336-00'),
     ('Rank', ' Assistant Professor'),
     ('Rank Effective Date', ' 31-DEC-2018'),
     ('Appt Begin Date', ' 31-DEC-2018'),
     ('Appt Percent', ' 100'),
     ('Appt End Date', ' N/A'),
     ('Annual Salary Rate', '   92961.00    9 mo'),
     ('Name', ' Abbasi, Bahman'),
     ('First Hired', ' 01-AUG-2017'),
     ('Home Orgn', ' LCB - Acad Prog / Student Aff'),
     ('Adj Service Date', ' 01-AUG-2017'),
     ('Job Orgn', ' EMM - Sch of Mech/Ind/Mfg Engr'),
     ('Job Type', ' O'),
     ('Job Title', ' Assistant Professor'),
     ('Posn-Suff', ' C18194-00'),
     ('Rank', ' Assistant Professor'),
     ('Rank Effective Date', ' 16-SEP-2017'),
     ('Appt Begin Date', ' 16-SEP-2017'),
     ('Appt Percent', ' 100'),
     ('Appt End Date', ' N/A'),
     ('Annual Salary Rate', '   97659.00    9 mo'),
     ('Job Orgn', ' LCB - Acad Prog / Student Aff'),
     ('Job Type', ' P'),
     ('Job Title', ' Assistant Professor'),
     ('Posn-Suff', ' C11566-00'),
     ('Rank', ' Assistant Professor'),
     ('Rank Effective Date', ' 16-SEP-2017'),
     ('Appt Begin Date', ' 16-SEP-2020'),
     ('Appt Percent', ' 100'),
     ('Appt End Date', ' 15-JUN-2021'),
     ('Annual Salary Rate', '   98811.00    9 mo')]

所需的最终数据帧(的缩写版本)在哪里:

| Name           | First Hired | Home Orgn                     | Adj Service Date | 
| Abbas, Houssam | 31-DEC-2018 | ESE - Sch Elect Engr/Comp Sci | 31-DEC-2018      | 
| Abbasi, Bahman | 01-AUG-2017 | LCB - Acad Prog / Student Aff | 01-AUG-2017      |

我尝试了hereherehere 提供的解决方案的变体,但没有任何运气。任何建议(可能包括处理原始原始数据的不同方式)都将不胜感激!

【问题讨论】:

  • 关键是认识到每次你看到“名字”,你就有了一个新记录的开始。

标签: python pandas dataframe


【解决方案1】:

您只需将元组列表转换为字典列表。 Pandas 将完成剩下的工作:

import pandas as pd

data = [('Name', ' Abbas, Houssam'),
     ('First Hired', ' 31-DEC-2018'),
     ('Home Orgn', ' ESE - Sch Elect Engr/Comp Sci'),
     ('Adj Service Date', ' 31-DEC-2018'),
     ('Job Orgn', ' ESE - Sch Elect Engr/Comp Sci'),
     ('Job Type', ' P'),
     ('Job Title', ' Assistant Professor'),
     ('Posn-Suff', ' C18336-00'),
     ('Rank', ' Assistant Professor'),
     ('Rank Effective Date', ' 31-DEC-2018'),
     ('Appt Begin Date', ' 31-DEC-2018'),
     ('Appt Percent', ' 100'),
     ('Appt End Date', ' N/A'),
     ('Annual Salary Rate', '   92961.00    9 mo'),
     ('Name', ' Abbasi, Bahman'),
     ('First Hired', ' 01-AUG-2017'),
     ('Home Orgn', ' LCB - Acad Prog / Student Aff'),
     ('Adj Service Date', ' 01-AUG-2017'),
     ('Job Orgn', ' EMM - Sch of Mech/Ind/Mfg Engr'),
     ('Job Type', ' O'),
     ('Job Title', ' Assistant Professor'),
     ('Posn-Suff', ' C18194-00'),
     ('Rank', ' Assistant Professor'),
     ('Rank Effective Date', ' 16-SEP-2017'),
     ('Appt Begin Date', ' 16-SEP-2017'),
     ('Appt Percent', ' 100'),
     ('Appt End Date', ' N/A'),
     ('Annual Salary Rate', '   97659.00    9 mo'),
     ('Job Orgn', ' LCB - Acad Prog / Student Aff'),
     ('Job Type', ' P'),
     ('Job Title', ' Assistant Professor'),
     ('Posn-Suff', ' C11566-00'),
     ('Rank', ' Assistant Professor'),
     ('Rank Effective Date', ' 16-SEP-2017'),
     ('Appt Begin Date', ' 16-SEP-2020'),
     ('Appt Percent', ' 100'),
     ('Appt End Date', ' 15-JUN-2021'),
     ('Annual Salary Rate', '   98811.00    9 mo')]

rows = []
for k,v in data:
    if k == 'Name':
        rows.append({})
    rows[-1][k]=v
#print(rows)
df = pd.DataFrame(rows)
print(df)

输出:

              Name   First Hired  ... Appt End Date   Annual Salary Rate
0   Abbas, Houssam   31-DEC-2018  ...           N/A     92961.00    9 mo
1   Abbasi, Bahman   01-AUG-2017  ...   15-JUN-2021     98811.00    9 mo

[2 rows x 14 columns]

【讨论】:

    猜你喜欢
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 2019-04-21
    • 1970-01-01
    • 2021-02-22
    • 2019-05-10
    相关资源
    最近更新 更多