python - 取消列出数据框 pandas 中的字典列表

标签 python pandas list numpy dataframe

我当前的 DataFrame 看起来像这样:

Index  Animal                                                   AnimalClassId
0      [{animalid:1,color:red,name:cat},{animalid:2,color:blue,name:cat2}]  1
1      [{animalid:3,color:pink,name:pig}]                                   2

所以第一列动物是每行的字典列表。每个动物行都有不同长度的列表。

我理想的输出是:

Index  Animal                           AnimalClassId
0      {animalid:1,color:red,name:cat}       1
1      {animalid:2,color:blue,name:cat2}     1
2      {animalid:3,color:pink,name:pig}      2

此外,这个数据集非常大(100000+行),所以我试图避免循环遍历每一行。有什么快速实现的好方法吗?如果有任何建议,我将不胜感激!

最佳答案

您可以通过以下方式执行此操作:

ideal_df = df.set_index(["AnimalClassId"])["Animal"]\
  .apply(pd.Series)\
  .stack()\
  .reset_index(level=1, drop=True)\
  .reset_index()

ideal_df.columns = ["AnimalClassId", "Animal"]

(请注意,您可以将其全部放在一行中或将其分成单独的行)

示例:

输入(您的示例):

df = pd.DataFrame({
    "Animal": [
        [{"animalid":1,"color":"red","name":"cat"}, {"animalid":2,"color":"blue","name":"cat2"}],
        [{"animalid":3,"color":"pink","name":"pig"}]
    ], 
    "AnimalClassId": [1, 2]
})

print(df)
                                              Animal  AnimalClassId
0  [{'animalid': 1, 'color': 'red', 'name': 'cat'...              1
1  [{'animalid': 3, 'color': 'pink', 'name': 'pig'}]              2

输出:

print(ideal_df)

   AnimalClassId                                            Animal
0              1    {'animalid': 1, 'color': 'red', 'name': 'cat'}
1              1  {'animalid': 2, 'color': 'blue', 'name': 'cat2'}
2              2   {'animalid': 3, 'color': 'pink', 'name': 'pig'}

如果您的列数不仅仅是“AnimalClassId”,则需要将这些列包含在传递给 set_index 的列表中。 ,并增加level参数传递给reset_index每增加一列就加 1。例如,如果您有“AnimalHabitat”列,那么您需要 set_index(["AnimalClassId", "AnimalHabitat"])reset_index(level=2, drop=True) .

这仍然需要在幕后循环您的数据。由于“动物”列中的数据不统一(长度不同的列表),我怀疑是否有一种方法可以以矢量化方式扩展每个元素,但这可以解决问题。

关于python - 取消列出数据框 pandas 中的字典列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53637048/

相关文章:

python - 如何在文本文件的不同行中写入每个 IP 地址?

python - 使用 pandas 和 json_normalize 来展平嵌套的 JSON API 响应

python - 计算数据帧中两个连续行之间的集合差异

c++ - 带有列表容器的优先级队列

r - 自定义函数后,在 R 控制台中调用对象会产生所需的结果,而 "View"来自环境的对象不会

python - 重写函数以避免 numpy.exp 中的溢出

python - 模拟使用相对导入导入的模块的日志记录

Python Sphinx 排除模式

python - 在 Pandas 数据框中插入总和行时如何保留列标题

java - 使用递归类定义创建第一个对象