我正在使用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列并将其拆分为其他列的最有效方法是什么?
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”列,以从每个键/值对中制作一个数据框。