Обход словаря в python Dataframe - PullRequest
1 голос
/ 09 июля 2020

Я пытаюсь пройти по словарю, присутствующему в строках моего python Dataframe. См. Одну строку Dataframe ниже для справки: столбец State пуст.

Безымянный: 0 Город Государство Страна Почтовый индекс Расстояние 720 4976 Барселона Испания 08001 {'08001': 0, '08002': 2.2, '08003': 2.2}

Когда я запускаю приведенный ниже код, эта ошибка появляется-> TypeError: строковые индексы должны быть целые числа

КОД:

import sys
import json
import pandas as pd
dfglobal=pd.read_csv("postcoderadius.csv")
#print(dfglobal)
filtered_df2  = pd.DataFrame([])
# s=sys.argv[1]
# ci=s[s.find("City=")+5:s.find("&State")]
# cs=s[s.find('State')+6:s.find("&Country")]
# ci=ci.replace('+','')
# cs=cs.replace('+','-')
# co=s[s.find("Country")+8:s.find("&ZipCode")]
# givenpostal=s[s.find("ZipCode")+8:s.find("&Radius")]
# radius=float(s[s.find("Radius")+8:])
ci="Barcelona"
co="Spain"
cs=""
givenpostal="08001"
radius=4.0
print(ci,co,cs,givenpostal,radius)
#print("hello1")
filtered_df2=pd.concat([filtered_df2,dfglobal[(dfglobal['Country'] == co) & (dfglobal['City'] == ci) &  (dfglobal['PostalCode'] == givenpostal)]])
#print(filtered_df2)
#filtered_df2['PostalCode']=filtered_df2['PostalCode'].apply(str)
a_dict=filtered_df2['Distance']
#print(a_dict)
result  = pd.DataFrame([])
resp=[]
resr=[]
for index, row in filtered_df2.iterrows():
    #print(row['Distance'])
    dictp=row['Distance']
    for key in dictp: 
        print(dictp[key])


result['PostalCode']=resp
result['City']=ci
result['Country']=co
result['Radius']=resr
result=result.reindex(["City","Country","PostalCode","Radius"],axis=1)
result.to_csv("distance.csv")    

1 Ответ

0 голосов
/ 10 июля 2020

Похоже, что row['Distance'] возвращает не словарь, а строку. (если нет, дайте полный воспроизводимый пример)

Итак, после dictp = row['Distance'] dictp - это строка.

for key in dictp вернет каждую букву строки.

print(dictp[key]) вызовет ошибку, потому что для строк key должно быть числом.

Вы можете проверить, является ли это вашей проблемой, набрав type(dictp) после dictp=row['Distance'] строка. Если это печатает str, то причина в этом.

Вот как вы можете это исправить:

Вы можете преобразовать строку в настоящий словарь с помощью функции eval().

Как это:

dictp = "{'08001': 0, '08002': 2.2, '08003': 2.2}"
mydict = eval(dictp)

Обратите внимание, что это угроза безопасности, если вы не можете гарантировать, что действительно существует dict для всех строк, потому что он запускает код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...