Python 如何在pandas中展平json字段
我正在加载一个带有嵌套值的json文件。以下是它的加载方式:Python 如何在pandas中展平json字段,python,pandas,Python,Pandas,我正在加载一个带有嵌套值的json文件。以下是它的加载方式: >>> pd.read_json('/Users/david/Desktop/validate_headers/json/example_array2.json') address firstname lastname zip_code 0 {'state': 'MI', 'town': 'Dearborn'} Jimmie B
>>> pd.read_json('/Users/david/Desktop/validate_headers/json/example_array2.json')
address firstname lastname zip_code
0 {'state': 'MI', 'town': 'Dearborn'} Jimmie Barninger 12345
1 {'state': 'CA', 'town': 'Los Angeles'} John Doe 90027
我想展平嵌套对象,以便我的结束数据帧如下所示:
firstname lastname zip_code address.state address.town
Jimmie Barninger 12345 MI Dearborn
John Doe 90027 CA Los Angeles
我该怎么做,也就是说,如果dataframe列是一个对象,将该列拆分为多个列(直到没有json对象为止)?如果您的
地址列不是字典,您可以通过以下方式转换为一个:
import ast
df.address = [ast.literal_eval(df.address[i]) for i in df.index]
然后:
df.address.apply(pd.Series)
state town
0 MI Dearborn
1 CA Los Angeles
虽然不确定数据集的长度,但也可以通过以下方式实现:
def literal_return(val):
try:
return ast.literal_eval(val)
except (ValueError, SyntaxError) as e:
return val
df.address.apply(literal_return)
>>%timeit [ast.literal_eval(df.address[i]) for i in df.index]
144 µs ± 2.4 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
>>%timeit df.address.apply(literal_return)
454 µs ± 4.02 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
简单得多:
df = pd.DataFrame({'address': [{'state': 'MI', 'town': 'Dearborn'} , {'state': 'CA', 'town': 'Los Angeles'}], 'name':['John', 'Jane']})
df = df.join(df['address'].apply(pd.Series))
然后
下面是一种使用apply
的方法:
df['city'] = df.address.apply(lambda x: x.split(',')[0].split(':')[1].replace("'","").replace("}",""))
df['state'] = df.address.apply(lambda x: x.split(',')[1].split(':')[1].replace("'","").replace("}",""))
df.drop(columns=['address'], inplace=True)
在下面使用()
如果你使用类型(df.loc[0,'address'])
@meWobject
你会得到什么,但我也能从大多数字符串中得到。很好,那么ast.literal\u eval()
就是你的救星,正如@anky\u 91所解释的那样,它工作得很好,不过如果对象很大并且嵌套,这不是很慢吗?是的。谢谢你的努力。我想知道在apply
下使用split
是否可以减少开销。无论如何,谢谢你的比较。我将分享我的方法。给我一点时间。@anky_91你能比较一下我的方法和理解力的表现吗。我很想看到结果。太好了,这说明了一切+从我这边来,也许吧。但如果用pd.read_json加载json,它是一个对象,而不是字符串。如果你也想解析json字符串,只需.apply(json.loads,axis=1)
对我来说,注释是:“@meW object,但大多数字符串我也能得到它。”这意味着他也能得到大多数字符串的“object”类型。并不一定意味着他实际上有json的字符串表示
df['city'] = df.address.apply(lambda x: x.split(',')[0].split(':')[1].replace("'","").replace("}",""))
df['state'] = df.address.apply(lambda x: x.split(',')[1].split(':')[1].replace("'","").replace("}",""))
df.drop(columns=['address'], inplace=True)
from pandas.io.json import json_normalize