【问题标题】:Adding multiple dictionaries into a single Dataframe pandas将多个字典添加到单个 Dataframe 大熊猫中
【发布时间】:2019-07-28 00:34:33
【问题描述】:

我有一组通过 for 循环获得的 python 字典。我正在尝试将这些添加到 Pandas Dataframe 中。

名为output的变量的输出

{'name':'Kevin','age':21}
{'name':'Steve','age':31}
{'name':'Mark','age':11}

我正在尝试将这些字典中的每一个附加到单个 Dataframe 中。我尝试执行以下操作,但它只是添加了第一行。

df = pd.DataFrame(output)

任何人都可以就哪里出错并将所有字典添加到数据框提出建议。

循环语句更新

以下代码有助于读取 xml 并将其转换为数据框。现在我看到我能够循环访问多个 xml 文件并为每个 xml 文件创建字典。我正在尝试查看如何将这些字典中的每一个添加到单个数据框:

def f(elem, result):
    result[elem.tag] = elem.text
    cs = elem.getchildren()
    for c in cs:
        result = f(c, result)
    return result

    result = {}
    for file in allFiles:
        tree = ET.parse(file)
        root = tree.getroot()
        result = f(root, result)
        print(result)

【问题讨论】:

标签: pandas


【解决方案1】:

您可以将每个字典附加到列表并最后调用DataFrame 构造函数:

out = []
for file in allFiles:
    tree = ET.parse(file)
    root = tree.getroot()
    result = f(root, result)
    out.append(result)
        
df = pd.DataFrame(out)

【讨论】:

  • 感谢您的帮助。我尝试了您上面提到的第一种方法,发现我只能将标题列返回到 Dataframe df
  • 我遇到的问题是,将来我将在具有不同标题列的不同文件中运行它,因此我无法每次定义标题列。
  • @codinglearner - 所以在 lopp 中不可能创建字典列表?
  • 已添加循环语句,我正在努力克服。但是我无法将它添加到数据框。希望这会有所帮助。
  • @codinglearner - 更好,也可以添加一些与您的代码一起使用的数据示例?
【解决方案2】:

我们可以将这些字典添加到列表中:

ds = []
for ...:      # your loop
    ds += [d] # where d is one of the dicts

当我们有字典列表时,我们可以简单地在该列表上使用pd.DataFrame

ds = [
    {'name':'Kevin','age':21},
    {'name':'Steve','age':31},
    {'name':'Mark','age':11}
]
pd.DataFrame(ds)

输出:

    name  age
0  Kevin   21
1  Steve   31
2   Mark   11

更新: 如果不同的字典有不同的键,这不是问题,例如:

ds = [
    {'name':'Kevin','age':21},
    {'name':'Steve','age':31,'location': 'NY'},
    {'name':'Mark','age':11,'favorite_food': 'pizza'}
]
pd.DataFrame(ds)

输出:

   age favorite_food location   name
0   21           NaN      NaN  Kevin
1   31           NaN       NY  Steve
2   11         pizza      NaN   Mark

更新 2: 基于我们之前在Python - Converting xml to csv using Python pandas 中的讨论,我们可以这样做:

results = []
for file in glob.glob('*.xml'):
    tree = ET.parse(file)
    root = tree.getroot()
    result = f(root, {})
    result['filename'] = file # added filename to our results
    results += [result]

pd.DataFrame(results)

【讨论】:

  • 感谢您的帮助。我从你帮助我构建 xml 到 csv 转换器的另一张票继续。由于这是一个新问题,我对此提出了新的要求。我有来自每个 xml 文件的多个字典,但现在尝试将它们添加到 Dataframe
  • 我尝试通过执行以下操作将所有字典添加到列表中 ds = [] for i in result: ds += [i] print(ds) 以上将字典转换为列表,但不是列表内的字典,如下所示。样本输出:['name':'Kevin','age':21]['name':'Steve','age':31]['name':'Mark','age':11]
  • 好的,让我澄清一下,在每一步我们都会得到一个像 {'name': 'Kevin', ...} 这样的字典,对吧?
  • 好的,太好了,你能检查一下Update 2的代码吗?
  • 在结果中添加了文件名result['filename'] = file # added filename to our results
猜你喜欢
  • 2018-08-13
  • 2019-04-27
  • 2022-01-23
  • 1970-01-01
  • 2013-06-29
  • 2016-03-09
  • 2019-04-30
  • 2021-08-07
  • 2017-09-10
相关资源
最近更新 更多