Pandas groupby дает «keyError», даже когда ключ существует - PullRequest
0 голосов
/ 29 июня 2019

Я новичок в Python, и для одного из моих проектов мне нужно конвертировать csv во вложенный Json.Поиск в сети, я нашел pandas полезны в этом случае.Я следовал за аппроксимацией, приведенной в Преобразование данных CSV во вложенный JSON в Python Но я получаю исключение keyError KeyError: 'state'

df info
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4 entries, 0 to 3
Data columns (total 3 columns):
country    4 non-null object
 state     4 non-null object
 city      4 non-null object
dtypes: object(3)
memory usage: 176.0+ bytes
None
Traceback (most recent call last):
  File "csvToJson.py", line 31, in <module>
    grouped = df.groupby(['country', 'state'])
  File "/home/simarpreet/Envs/j/lib/python3.7/site-packages/pandas/core/generic.py", line 7632, in groupby
    observed=observed, **kwargs)
  File "/home/simarpreet/Envs/j/lib/python3.7/site-packages/pandas/core/groupby/groupby.py", line 2110, in groupby
    return klass(obj, by, **kwds)
  File "/home/simarpreet/Envs/j/lib/python3.7/site-packages/pandas/core/groupby/groupby.py", line 360, in __init__
    mutated=self.mutated)
  File "/home/simarpreet/Envs/j/lib/python3.7/site-packages/pandas/core/groupby/grouper.py", line 578, in _get_grouper
    raise KeyError(gpr)
KeyError: 'state'

Ввод csv:

country, state, city
India, Delhi, Tilak nagar
India, Mumbai, Bandra
Australia, Queensland, Gold Coast
US, California, Los Angeles

Мой код:

csvFilePath = "/home/simarpreet/sampleCsv.csv"
jsonFilePath = "/home/simarpreet/sampleJson.json"
jsonFile = open(jsonFilePath, 'w')

df = pd.read_csv(csvFilePath, encoding='utf-8-sig')
print("df info")
print(df.info())
finalList = []

grouped = df.groupby(['country', 'state'])
for key, value in grouped:
    dictionary = {}

    j = grouped.get_group(key).reset_index(drop=True)
    dictionary['country'] = j.at[0, 'country']
    dictionary['state'] = j.at[0, 'state']

    dictList = []
    anotherDict = {}
    for i in j.index:

        anotherDict['city'] = j.at[i, 'city']

        dictList.append(anotherDict)

    dictionary['children'] = dictList

    finalList.append(dictionary)

json.dumps(finalList)

1 Ответ

1 голос
/ 29 июня 2019

Проблема с вашим CSV-файлом, в именах столбцов есть первые пробелы, из-за которых появляется ключевая ошибка.

Как указывает @ cs95, вы можете сделать

df.columns = df.columns.str.strip()

Или вы можете использовать read_csv для обработки пробелов:

pd.read_csv(csvFilePath, encoding='utf-8-sig', sep='\s*,\s*', engine='python')

PS: плохой способ справиться с этим:

grouped = df.groupby(['country', ' state'])
...