如何从包含字典的行创建新的数据框?

时间:2018-04-13 15:40:56

标签: python pandas dataframe

在Python3和pandas中,我有一个列的数据帧。每行都有一个列表,里面有字典。它是从文件中获得的:

import pandas as pd

geral = pd.read_csv("mandados_12_abr_2018_RJ.csv",sep=';',encoding = 'latin_1')

geral.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5298 entries, 0 to 5297
Data columns (total 4 columns):
mandados     5298 non-null object
mensagem     0 non-null float64
paginador    5298 non-null object
sucesso      5298 non-null bool
dtypes: bool(1), float64(1), object(2)
memory usage: 129.4+ KB

df1 = pd.DataFrame(geral['mandados'])

df1.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5298 entries, 0 to 5297
Data columns (total 1 columns):
mandados    5298 non-null object
dtypes: object(1)
memory usage: 41.5+ KB

“mandados”列的示例内容 - 一个列表,里面有字典:

[{'id': 409, 'numeroMandado': '2251-65.2012.8.19.0066.0001', 'nomeParte': 'CARLOS HENRIQUE BELARMINO DE OLIVEIRA', 'dataMandado': '2012-01-31', 'orgao': 'TJRJ', 'situacao': 'Aguardando Cumprimento', 'detalhes': ['Data de nascimento: 02/07/1987', 'Nacionalidade: Brasileira', 'Sexo: Masculino', 'Nome da Genitora: Luiza Maria Belarmino Dias', 'Nome do Genitor: Geraldo De Oliveira', 'Carteira de identidade: 213004088']}, {'id': 408, 'numeroMandado': '11451-97.2012.8.19.0001.0001', 'nomeParte': 'DANIEL NASCIMENTO SILVA', 'dataMandado': '2012-01-31', 'orgao': 'TJRJ', 'situacao': 'Aguardando Cumprimento', 'detalhes': ['Sexo: Masculino', 'Nacionalidade: Brasileira', 'Nome do Genitor: Não Declarado', 'Data de nascimento: 27/02/1993', 'Nome da Genitora: Marluce Nascimento Silva', 'Carteira de identidade: 276885555']}, {'id': 407, 'numeroMandado': '11451-97.2012.8.19.0001.0002', 'nomeParte': 'THIAGO SABINO DA SILVA', 'dataMandado': '2012-01-31', 'orgao': 'TJRJ', 'situacao': 'Aguardando Cumprimento', 'detalhes': ['Nome do Genitor: Joao Batista Benvindo Da Silva', 'Sexo: Masculino', 'Nome da Genitora: Eliza Sabino Miranda', 'Data de nascimento: 02/03/1988', 'Nacionalidade: Brasileira', 'Carteira de identidade: 216708446']}, ...

我想创建一个新的数据框,其中列是“df1”数据框每行中字典的项目。仅选择这些列:

nomeParte, orgao, numeroMandado, dataMandado, situacao and detalhes

有可能吗?

1 个答案:

答案 0 :(得分:1)

如果您只发布.csv的前几行,那么我可以确保我拥有相同的数据,这将有所帮助。但这似乎做你想要的:

list_dicts = [{'id': 409, 'numeroMandado': '2251-65.2012.8.19.0066.0001', 'nomeParte': 'CARLOS HENRIQUE BELARMINO DE OLIVEIRA', 'dataMandado': '2012-01-31', 'orgao': 'TJRJ', 'situacao': 'Aguardando Cumprimento', 'detalhes': ['Data de nascimento: 02/07/1987', 'Nacionalidade: Brasileira', 'Sexo: Masculino', 'Nome da Genitora: Luiza Maria Belarmino Dias', 'Nome do Genitor: Geraldo De Oliveira', 'Carteira de identidade: 213004088']}, {'id': 408, 'numeroMandado': '11451-97.2012.8.19.0001.0001', 'nomeParte': 'DANIEL NASCIMENTO SILVA', 'dataMandado': '2012-01-31', 'orgao': 'TJRJ', 'situacao': 'Aguardando Cumprimento', 'detalhes': ['Sexo: Masculino', 'Nacionalidade: Brasileira', 'Nome do Genitor: Não Declarado', 'Data de nascimento: 27/02/1993', 'Nome da Genitora: Marluce Nascimento Silva', 'Carteira de identidade: 276885555']}, {'id': 407, 'numeroMandado': '11451-97.2012.8.19.0001.0002', 'nomeParte': 'THIAGO SABINO DA SILVA', 'dataMandado': '2012-01-31', 'orgao': 'TJRJ', 'situacao': 'Aguardando Cumprimento', 'detalhes': ['Nome do Genitor: Joao Batista Benvindo Da Silva', 'Sexo: Masculino', 'Nome da Genitora: Eliza Sabino Miranda', 'Data de nascimento: 02/03/1988', 'Nacionalidade: Brasileira', 'Carteira de identidade: 216708446']}]
cols = ["nomeParte", "orgao", "numeroMandado", "dataMandado", "situacao", "detalhes"]
df = pd.DataFrame(list_dicts)[cols]

我刚从你的帖子中复制粘贴到词典列表中。您将此列表作为另一个数据帧的列,对吗?那是什么给你带来问题?如果此列表是'mandados'的{​​{1}}列,我认为您可以

geral

编辑 - 查看有问题的数据后

这个数据文件的格式很不寻常,但我们可以得到你想要的。两件主要的事情:

  1. 当您将文件作为csv读入时,pd.DataFrame(mandados.geral.tolist())[cols] 列中的值只是作为字符串读取(它们不会自动转换为列表等);这是正常和预期的行为。我们必须自己进行转换。
  2. 似乎mandados中的每一行都是字典列表 - 我假设你想要一个由所有这些列表组合而成的数据帧?
  3. 以下我认为会做你想做的事情:首先我们从字符串转换为字典列表(使用mandados;这是literal_eval的安全版本;它只会将可以被视为Python列表,元组,词组和数字类型的字符串转换为这些类型,但它不会执行任意代码)然后我们将所有列表合并为一个,最后创建一个数据帧。

    eval