Pandas Help - 分离一系列键/值对

时间:2018-01-17 05:28:55

标签: python-3.x pandas

第一篇文章......

请原谅天真但我在基于之前的帖子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

我可能无法自己提取数据或者可能会收到其他同事的文件,如何清理文件以正确拆分字典呢?

1 个答案:

答案 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实际上在某处包含单引号,其中需要双引号,将数据转换为字符串而不是键值对。在不知道实际数据的情况下,这仍然只是猜测。