从列表的字典中提取列表,然后附加到数据框

Posted

技术标签:

【中文标题】从列表的字典中提取列表,然后附加到数据框【英文标题】:Extract list from dict of lists then append to dataframe 【发布时间】:2018-11-28 20:03:52 【问题描述】:

我正在尝试从包含列表的 json 中提取一个字段,然后将该列表附加到数据框,但我遇到了一些不同的错误。

我想我可以将它写入 csv,然后用 Pandas 读取 csv,但我试图避免写入任何文件。我知道我也可以使用 StringIO 来制作 csv,但这有空字节的问题。替换那些将是(我认为)另一个逐行步骤,这将进一步延长脚本完成所需的时间......我正在针对返回数千个结果的查询运行它,因此保持快速和简单优先考虑

首先我尝试了这个:

hit_json = json.loads(hit)
for ln in hit_json.get('hits').get('hits'):
    df = df.append(ln['_source'], ignore_index=True)
print(df)

这给了我一个看起来像这样的结果:

1    2           3      4 
a    b    d,e,f...      x

然后我尝试了这个:

 df = df.append(ln['_source']['payload'], ignore_index=True)

但这给了我这个错误:

TypeError: cannot concatenate object of type "<class 'str'>"; only pd.Series, 
pd.DataFrame, and pd.Panel (deprecated) objs are valid

我正在寻找的是这样的:

0  1  2  3  4
d  e  f  g  h

除此之外...我需要找到一种方法来处理此列表中包含逗号的特定字符串...这可能是一个令人头疼的问题,最好在另一个问题中处理...例如:

# Obviously this is incorrect but I think you get the idea :)
str.replace(',', '^')
    except if ',' followed by ' '

非常感谢任何帮助!

编辑以按要求添加 JSON


"_index": "sanitized",
"_type": "sanitized",
"_id": "sanitized".,
"_score": sanitized,
"_source": 
    "sanitized": sanitized,
    "sanitized": "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,\"34,35\",36,37,38,39,40",
    "sanitized": "sanitized",
    "sanitized": ["sanitized"],
    "sanitized": "sanitized",
    "sanitized": "sanitized",
    "sanitized": "sanitized",
    "sanitized": "sanitized",

]


【问题讨论】:

请显示 JSON Json 按要求添加 仍然不清楚:在这个 JSON 中看不到“命中” 【参考方案1】:

你也许可以用 StringIO 写一个临时文件,就像 here 那样。

然后你可以做第二部分

if ',' in data and ', ' not in data:
    data = data.replace(',', '^')

【讨论】:

我也试过这个......它很慢并且有空字节问题,如果有一个空字节它就完全失败了。解决方法是替换空字节,但这是逐行进行的另一个步骤。这绝对是一个可能的解决方案,虽然我希望我可以让它在没有 StringIO 的情况下工作【参考方案2】:

你可以试试下面的

hit_json = json.loads(hit)
for ln in hit_json.get('hits').get('hits'):
     data = ln['_source']["payload"].split(",")
     df.loc[len(df)] = pd.Series(data, index=range(len(data)))
print(df)

loc 的好处是您不会每次都创建新的数据帧,因此速度会很快。你可以找到here的帖子。

我还想提出一个更快的替代方案。首先创建一个包含所有数据的字典,然后将字典转储到数据框中。

【讨论】:

以上是关于从列表的字典中提取列表,然后附加到数据框的主要内容,如果未能解决你的问题,请参考以下文章

将 Pymongo 数据从列表附加到 pandas 数据框

从熊猫字典列表中提取元素

Python - 将字典列表附加到嵌套的默认字典时出现关键错误

将字典附加到循环中的列表

将列表中的字典追加到熊猫数据框

如何从列表中的多个字典附加到具有“内部”字典特定部分的另一个列表?