我正在读取每行一个 JSON 对象的文件(ndjson)
dfjson = pd.read_json(path_or_buf=JsonFicMain,orient='records',lines=True)
这是数据框内容的 2 行示例(删除列后)
nomCommune codeCommune numeroComplet nomVoie codePostal meilleurePosition codesParcelles
0 Ablon-sur-Seine 94001 21 Rue Robert Schumann 94480 {'type': 'parcelle', 'geometry': {'type': 'Point', 'coordinates': [2.411247955172414, 48.726054248275865]}} [94001000AG0013]
1 Ablon-sur-Seine 94001 13 Rue Robert Schumann 94480 {'type': 'parcelle', 'geometry': {'type': 'Point', 'coordinates': [2.412065866666666, 48.72614911111111]}} [94001000AG0020]
它包含数百万行,我想在特定列(名为 meilleurePosition)中提取方括号之间的一个地理坐标。预期的输出是
[2.411247955172414, 48.726054248275865]
我尝试使用 extractall 提取坐标或替换所有其他不需要的字符,或者提取不匹配
test=dfjson['meilleurePosition'].str.extract(pat='(\d+\.\d+)')
test2=dfjson['meilleurePosition'].str.extractall(pat='(\d+\.\d+)')
Empty DataFrame
Columns: [0]
Index: []
使用替换,或 str.replace 不起作用
test3=dfjson["meilleurePosition"].replace(to_replace=r'[^0-9.,:]',value='',regex=True)
0 {'type': 'parcelle', 'geometry': {'type': 'Point', 'coordinates': [2.411247955172414, 48.726054248275865]}}
1 {'type': 'parcelle', 'geometry': {'type': 'Point', 'coordinates': [2.412065866666666, 48.72614911111111]}}
即使没有正则表达式类型也不起作用
test4=dfjson['meilleurePosition'].str.replace('type','whatever')
0 NaN
1 NaN
print(test)
我试图找出为什么这根本不起作用。
- 列类型是“对象”(这显然很好,因为这是一个字符串)
- 使用 inplace=True 而不复制数据框会导致类似的结果
为什么我不能操作此列,是因为其中的特殊字符吗?如何以良好的格式获得这些坐标?
好的,经过更多调查,该列包含一个嵌套的字典,这就是它不起作用的原因 这个答案帮助了我很多 python pandas 使用带有正则表达式的地图 然后使用以下代码创建一个具有预期坐标的新列
def extract_coord(meilleurepositiondict):
if isinstance(meilleurepositiondict,dict) :
return meilleurepositiondict['geometry']['coordinates']
else :
return None
dfjson['meilleurePositionclean']=dfjson['meilleurePosition'].apply(lambda x: extract_coord(x))