我正在尝试从包含列表的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",
}
}]
}
}
答案 0 :(得分:0)
您也许可以用StringIO编写一个临时文件,就像完成here一样。
然后在第二部分中可以做
if ',' in data and ', ' not in data:
data = data.replace(',', '^')
答案 1 :(得分:0)
您可以尝试以下
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。
我还想提出一个更快的选择。首先创建一个包含所有数据的字典,然后将字典转储到数据框中。