第一篇文章......
请原谅天真但我在基于之前的帖子Splitting dictionary/list inside a Pandas Column into Separate Columns
挣扎于我认为是一个简单的问题我尝试将数据框中的列从CSV文件拆分为单独的列,其中键成为列标签,值为索引。
以下是该列的前几个实例。
captionTime
0 {'startTimeMs': 113488, 'endTimeMs': 116700}
1 {'startTimeMs': 116742, 'endTimeMs': 121080}
2 {'startTimeMs': 121121, 'endTimeMs': 122706}
3 {'startTimeMs': 128462, 'endTimeMs': 129838}
当我跑步时:
df2 = df['captionTime'].apply(pd.Series)
它只返回一个系列,而不是两个标有' startTimeMs' &安培; ' endTimeMs'
0
0 {'startTimeMs': 113488, 'endTimeMs': 116700}
1 {'startTimeMs': 116742, 'endTimeMs': 121080}
2 {'startTimeMs': 121121, 'endTimeMs': 122706}
3 {'startTimeMs': 128462, 'endTimeMs': 129838}
更新
我能够获取同事用于导出CSV文件的原始API代码。
CSV片段:
captionTime,contentType,language,region,timedTextType
"{'startTimeMs': 5000, 'endTimeMs': 6708}",None,id,{},SUBS
"{'startTimeMs': 15875, 'endTimeMs': 19125}",None,id,{},SUBS
"{'startTimeMs': 19500, 'endTimeMs': 22875}",None,id,{},SUBS
"{'startTimeMs': 27791, 'endTimeMs': 30291}",None,id,{},SUBS
出于好奇,我尝试了在编写数据之前拆分系列的初始方法,它没有问题。我知道r.json()会返回一个字典,所以我假设 - 当pandas读取CSV时,它会将captionTime列读为字符串,而不是字典。
输入:
r = session.post("{}{}".format(endpoint, api), headers=headers, data=json.dumps(body), params=params)
r.raise_for_status()
rDict = r.json()
results = rDict['results']
df = pd.DataFrame(results)
df2 = df['captionTime'].apply(pd.Series)
print(df2)
输出:
endTimeMs startTimeMs
0 6708 5000
1 19125 15875
2 22875 19500
3 30291 27791
我可能无法自己提取数据或者可能会收到其他同事的文件,如何清理文件以正确拆分字典呢?
答案 0 :(得分:0)
相关条目是字符串,而不是字典。看起来JSON格式不正确(*)(或者JSON解析器中存在错误)。
我可以建议一些解决方法,但没有一个是理想的。
鉴于以下数据:
data = {'captionTime': [ "{'startTimeMs': 113488, 'endTimeMs': 116700}",
"{'startTimeMs': 116742, 'endTimeMs': 121080}",
"{'startTimeMs': 121121, 'endTimeMs': 122706}",
"{'startTimeMs': 128462, 'endTimeMs': 129838}",]}
和一个DataFrame:
import pandas as pd
df = pd.DataFrame(data)
您可以通过两种方式将相关列条目转换为dict(有警告):
import ast
df['captionTime'] = df['captionTime'].apply(lambda x: ast.literal_eval(x))
以上内容依赖于对条目格式的信任。 ast.literal_eval
肯定比简单eval
更安全,但可能仍会导致问题。
另一种方法是将其解析为JSON,但是您需要将单引号转换为双引号(*):
import json
df['captionTime'] = df['captionTime'].apply(lambda x: json.loads(x.replace("'", '"')))
如果两个单引号内有双引号(即由于某种原因,字典条目的键有双引号),则会失败。
(*)可能是JSON实际上在某处包含单引号,其中需要双引号,将数据转换为字符串而不是键值对。在不知道实际数据的情况下,这仍然只是猜测。