Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在pandas中展平json字段_Python_Pandas - Fatal编程技术网

Python 如何在pandas中展平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

我正在加载一个带有嵌套值的json文件。以下是它的加载方式:

>>> 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'])
@meW
object
你会得到什么,但我也能从大多数字符串中得到。很好,那么
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