当前位置: 首页 > 面试题库 >

使用熊猫解析从CSV加载的JSON字符串

颜安宁
2023-03-14
问题内容

我正在使用CSV文件,其中几个列具有一个简单的json对象(几个键值对),而其他列则是正常的。这是一个例子:

name,dob,stats
john smith,1/1/1980,"{""eye_color"": ""brown"", ""height"": 160, ""weight"": 76}"
dave jones,2/2/1981,"{""eye_color"": ""blue"", ""height"": 170, ""weight"": 85}"
bob roberts,3/3/1982,"{""eye_color"": ""green"", ""height"": 180, ""weight"": 94}"

使用完后df = pandas.read_csv('file.csv'),解析该stats列并将其拆分为其他列的最有效方法是什么?

大约一个小时后,我唯一能想到的是:

import json
stdf = df['stats'].apply(json.loads)
stlst = list(stdf)
stjson = json.dumps(stlst)
df.join(pandas.read_json(stjson))

看来我做错了,考虑到我需要定期在三列上进行,这需要大量工作。

所需的输出是下面的数据框对象。添加了以下代码行以我((脚的)方式到达那里:

df = df.join(pandas.read_json(stjson))
del(df['stats'])
In [14]: df

Out[14]:
          name       dob eye_color  height  weight
0   john smith  1/1/1980     brown     160      76
1   dave jones  2/2/1981      blue     170      85
2  bob roberts  3/3/1982     green     180      94

问题答案:

有一种稍微简单的方法,但是最终您必须调用json.loads。pandas.read_csv中有一个转换器的概念。

converters : dict. optional

Dict of functions for converting values in certain columns. Keys can either be integers or column labels

因此,首先定义您的自定义解析器。在这种情况下,下面的方法应该起作用:

def CustomParser(data):
    import json
    j1 = json.loads(data)
    return j1

您的情况如下:

df = pandas.read_csv(f1, converters={'stats':CustomParser},header=0)

我们告诉read_csv以标准方式读取数据,但对于stats列,请使用我们的自定义解析器。这将使“统计信息”列成为 字典

从这里开始,我们可以使用一些技巧直接在第一步中将这些列与适当的列名称一起附加。这仅适用于常规数据(json对象需要具有3个值,或者至少需要在我们的CustomParser中处理缺少的值)

df[sorted(df['stats'][0].keys())] = df['stats'].apply(pandas.Series)

在左侧,我们从stats列的元素键中获得新的列名。stats列中的每个元素都是一个字典。因此,我们正在做批量分配。在右侧,我们使用apply分解“
stats”列,以从每个键/值对中制作一个数据框。



 类似资料:
  • 我试图加载一个csv文件内基于熊猫的数据帧。我使用了以下导入。 没有找到文件是抛出错误,回溯如下: ()中的FileNotFoundError回溯(最近一次调用)---- c:\users\saish\appdata\local\programs\python\python35-32\lib\site packages\pandas\io\parsers。语法分析器中的py\u f(文件路径或缓冲

  • 问题内容: 我正在加载一个包含浮点和字符串数据混合的txt文件。我想将它们存储在可以访问每个元素的数组中。现在我正在做 这是输入文件的结构:。 现在,数据将作为唯一列导入。我如何划分它,以便分别存储不同的元素(所以我可以调用)?以及如何定义标题? 问题答案: 您可以使用: 添加您的代码,在引号之间留一个空格。因此,熊猫可以检测值之间的空格并按列排序。数据列用于命名您的列。

  • 我正在学习如何通过pandas将大型csv文件加载到python中。我正在使用anaconda和Python3与一台64 GB内存的pc。 贷款组合是一个很大的例子。csv数据集由2509列和100000行组成,约为1.4 GBs。 我可以毫无错误地运行以下代码: 然而,当我使用贷款组合时,例如,大型。csv文件创建一个更大的文件,即Loan\u Portfolio\u Example\u Lar

  • 问题内容: 试图从Wiki页面获取信息框。为此,我正在使用Wiki API。以下是我从中获取json数据的url。 http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&format=json&titles= “ + first +”&rvsection = 0 首先是一个变量,其中包含Wikipe

  • 问题内容: 我对此有一个类似的问题:Pandas DataFrame:从一列中的字符串中删除不需要的部分 。 所以我用了: 大多数项目以“ PPI /”开头,但并非全部。似乎当没有’PPI /’后缀的项目遇到此错误时: AttributeError:“ float”对象没有属性“ lstrip” 我在这里想念什么吗? 问题答案: 使用replace: 或string.replace:

  • 问题内容: 我有一个包含字母数字键的数据框,我想另存为csv并在以后读取。由于种种原因,我需要以字符串格式显式读取此键列,所以我使用的键严格地是数字的,甚至更糟,例如:1234E5,Pandas会将其解释为浮点数。这显然使密钥完全无用。 问题是,当我为数据框或其中的任何列指定字符串dtype时,我只会得到垃圾回收。我在这里有一些示例代码: 数据框如下所示: 然后我像这样阅读: 结果是: 这是我的计