我有這個資料集
obras = pd.DataFrame(
[['1','Entre Ríos'],['2', 'Entre Rios'],['3','entre Ríos'], ['4','Entre ríos']],
columns = ['id', 'prov']
)
為了規范“Prov”的名稱,我呼叫了一個 API
API_BASE_URL = "https://apis.datos.gob.ar/georef/api/"
def get_similar_bulk(endpoint, nombres):
# realiza consulta a la API
data = {
endpoint: [
{"nombre": nombre, "max": 1} for nombre in nombres
]}
url = API_BASE_URL endpoint
results = requests.post(
url, json=data, headers={"Content-Type": "application/json"}
).json()
# convierte a una lista de "resultado más probable" o "vacío" cuando no hay
parsed_results = [
single_result[endpoint][0] if single_result[endpoint] else {}
for single_result in results["resultados"]
]
return parsed_results
obras['prov_norm'] = get_similar_bulk("provincias", obras['prov'])
結果我得到
| ID | 證明 | prov_norm |
|---|---|---|
| 1 | 進入里奧斯 | {'質心':{'lat':-32.0588735436448,'lon':-59.2014475514635},'id':'30','nombre':'Entre Ríos'} |
| 2 | 進入里奧斯 | {'質心':{'lat':-32.0588735436448,'lon':-59.2014475514635},'id':'30','nombre':'Entre Ríos'} |
| 3 | 進入里奧斯 | {'質心':{'lat':-32.0588735436448,'lon':-59.2014475514635},'id':'30','nombre':'Entre Ríos'} |
| 4 | 進入 | {'質心':{'lat':-32.0588735436448,'lon':-59.2014475514635},'id':'30','nombre':'Entre Ríos'} |
預期的結果是:
| ID | 證明 | 緯度 | 隆 | ID | 名詞 |
|---|---|---|---|---|---|
| 1 | 進入里奧斯 | -32.0588735436448 | -59.2014475514635 | 30 | 進入里奧斯 |
| 2 | 進入里奧斯 | -32.0588735436448 | -59.2014475514635 | 30 | 進入里奧斯 |
| 3 | 進入里奧斯 | -32.0588735436448 | -59.2014475514635 | 30 | 進入里奧斯 |
| 4 | 進入 | -32.0588735436448 | -59.2014475514635 | 30 | 進入里奧斯 |
我該如何解決這個問題?
謝謝!!!
uj5u.com熱心網友回復:
如果你想要 sperate 列,那么你必須像這樣將資料放在 sperate 列中:
在 get_similar_bulk 函式中:
# convierte a una lista de "resultado más probable" o "vacío" cuando no hay
parsed_results = [
single_result[endpoint][0] if single_result[endpoint] else {}
for single_result in results["resultados"]
]
parsed_results = [{'lat':x['centroide']['lat'],'lon': x['centroide']['lon'],'id_obras': x['id'],'nombre':x['nombre']} for x in parsed_results ]
parsed_results=[[x[0] for x in parsed_results],[x[1] for x in parsed_results],[x[2] for x in parsed_results],[x[3] for x in parsed_results]]
return parsed_results
obras['lat'],obras['lon'],obras['id'],obras['nombre'] =
get_similar_bulk("provincias", obras['prov'])
但是如果我們在您的代碼之后更改資料:
obras['lat'] = obras['prov_norm'].apply(lambda x: x['centroide']['lat'])
obras['lon'] = obras['prov_norm'].apply(lambda x: x['centroide']['lon'])
obras['id_obras'] = obras['prov_norm'].apply(lambda x: x['id'])
obras['nombre'] = obras['prov_norm'].apply(lambda x: x['nombre'])
obras = obras.drop('prov_norm', 1)
但我不明白為什么所有行的資料都相同。這也是您問題的一部分嗎?或者它只是一個示例代碼?
uj5u.com熱心網友回復:
如果我沒記錯的話,您可以使用當前的parsed_results:
obras_prov_norm = pd.DataFrame(
{**d.pop('centroide', {}), **d}
for d in get_similar_bulk('provincias', obras['prov'])
)
obras = pd.concat([obras, obras_prov_norm], axis='columns')
uj5u.com熱心網友回復:
您還可以嘗試如下所示的熊貓“json_normalize”:
import pandas as pd
results = get_similar_bulk("provincias", obras['prov'])
df_results = pd.json_normalize(results)
print(df_results)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/369912.html
