Python 如何使用字典从行创建新的数据帧?

Python 如何使用字典从行创建新的数据帧?,python,pandas,dataframe,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

在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
我想创建一个新的dataframe,其中列是df1 dataframe每行中字典的项。仅选择以下列:

nomeParte, orgao, numeroMandado, dataMandado, situacao and detalhes

可以这样做吗?

如果您可以只发布.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]
我刚刚从你的帖子中复制粘贴在词典列表中的内容。您将此列表作为另一个数据帧的列,对吗?这就是给你带来麻烦的原因?如果这个列表是geral的“mandados”列,我想你可以这样做

pd.DataFrame(mandados.geral.tolist())[cols]
编辑-查看相关数据后

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

当您以csv形式读取文件时,mandados列中的值仅作为字符串读取,而不会自动转换为列表或类似的内容;这是正常和预期的行为。我们必须自己做转换。 mandados中的每一行似乎都是一个字典列表——我假设您想要一个由所有这些列表组合而成的数据帧? 我认为有一件事可以满足您的需要:首先,我们使用literal_eval将字符串转换为字典列表;这是eval的安全版本;它只是将可以被视为Python列表、元组、dict和数字类型的字符串转换为这些类型,但它不会执行任意代码,然后我们将所有列表合并为一个,最后生成一个数据帧

import pandas as pd
from ast import literal_eval

df = pd.read_csv('mandados_12_abr_2018_RJ.csv', sep=';')
all_lists = sum((literal_eval(l) for l in df.mandados.tolist()), [])
cols = ["nomeParte", "orgao", "numeroMandado", "dataMandado", "situacao", "detalhes"]
df = pd.DataFrame(all_lists)[cols]

这是可能的。最好是找到一种直接从.csv创建它的方法。谢谢。你的意思是阅读CSV并只选择列mandados和其中所需的列吗?与提供的示例有点混淆,但要澄清mandados是一个字典列表?因为尽管您提到了这一点,但第一个列表]在Paginatory之前就被关闭了。您的数据杂乱无章,格式错误。你能编辑你的文章,使其可读和复制/粘贴?谢谢,我已经提出了更多的行的例子。如果更好的话,我可以把文件寄过去谢谢。我执行了-mandados=pd.DataFramegeral.mandados.tolist[cols]-并且出现了这个错误:keyrerror:['nomeParte''orgao''numeriomandado''datamandao''situacao''detalhes']不在索引中,即geral中的索引是:mandados、mensage、paginador和sucesso。在mandados中有带字典的列表,文件如下:
import pandas as pd
from ast import literal_eval

df = pd.read_csv('mandados_12_abr_2018_RJ.csv', sep=';')
all_lists = sum((literal_eval(l) for l in df.mandados.tolist()), [])
cols = ["nomeParte", "orgao", "numeroMandado", "dataMandado", "situacao", "detalhes"]
df = pd.DataFrame(all_lists)[cols]