我当前的 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/