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

时间:2018-06-19 19:15:57

标签: python list pandas dictionary

我正在尝试从包含列表的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",
}
}]
}
}

2 个答案:

答案 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

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