0

我正在读取每行一个 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))
4

1 回答 1

0

我使用下面的代码找到了解决方案

dfjson['meilleurePosition']=dfjson['meilleurePosition'].apply(lambda x: extract_coord(x) if x == x else defaultmeilleurepositionvalue)

这是必需的,因为空行会导致错误(未困在函数定义中)。但是,我仍然相信有很多简单的方法可以将列的 dict 值分配给列本身,仍在尝试......

于 2020-08-25T13:19:24.697 回答