pandas dataframe - строковые индексы должны быть целыми числами - - PullRequest
1 голос
/ 19 июня 2020

У меня есть следующий JSON -File

    {"Global Quote": {"01. symbol": "MSFT", "02. open": "194.0000", "03. high": "196.4900", "04. low": 
    "194.0000", "05. price": "196.3200", "06. volume": "22966814", "07. latest trading day": "2020-06- 
     18", "08. previous close": "194.2400", "09. change": "2.0800", "10. change percent": "1.0708%"}}

В моем dict есть другой dict, поэтому я делаю следующее:

f = open('data.json',)
meta = json.load(f)
data = meta['Global Quote']

Результаты следующие:

{"01. symbol": "MSFT", "02. open": "194.0000", "03. high": "196.4900", "04. low": "194.0000", "05. price": "196.3200", "06. volume": "22966814", "07. latest trading day": "2020-06-18", "08. previous close": "194.2400", "09. change": "2.0800", "10. change percent": "1.0708%"}

Прямое преобразование в CSV, к сожалению, невозможно, потому что отображается следующая ошибка:

df = pd.read_json('data.json')
df.to_csv('datatest.csv', encoding='utf-8-sig')
ValueError: If using all scalar values, you must pass an index 

Но если я попытаюсь манипулировать им с помощью фреймов данных, я получаю следующую ошибку :

response = requests.request("GET", url, headers=headers, params=querystring)

info = response.json()

with open('data.json', 'w') as fp:
    json.dump(info, fp)


f = open('data.json',)

meta = json.load(f)
data = meta['Global Quote']

df=pd.DataFrame(columns=['symbol','open','high','low','price','volume','latest trading day','previous close','change','change percent'])
for d,p in data.items():
    data_row = [float(p['1. symbol']),float(p['2. open']),float(p['3. high']),float(p['4. low']),float(p['5. price']),int(p['6. volume']),float(p['7. latest trading day']),int(p['8. previous close']),float(p['9. change']),int(p['10. change percent'])]
df =df.sort_values('symbol')

print(df)
df.to_csv('testfile.csv')
TypeError: string indices must be integers

Есть ли лучший способ записать файл в CSV? Большое спасибо

1 Ответ

1 голос
/ 19 июня 2020

Вам не нужно перебирать все элементы данных.

Попробуйте просто передать индекс во время создания фрейма данных:

f = open('data.json',)

meta = json.load(f)
data = meta['Global Quote']
df = pd.DataFrame(data, index=[0])
df.to_csv('testfile.csv', index = False)

Если у вас более одного значения на JSON, например:

{"Global Quote": [{"01. symbol": "MSFT", "02. open": "194.0000", "03. high": "196.4900", "04. low": "194.0000", "05. price": "196.3200", "06. volume": "22966814", "07. latest trading day": "2020-06-18", "08. previous close": "194.2400", "09. change": "2.0800", "10. change percent": "1.0708%"},
                  {"01. symbol": "IBM", "02. open": "228.0000", "03. high": "196.4900", "04. low": "194.0000", "05. price": "196.3200", "06. volume": "22966814", "07. latest trading day": "2020-06-28", "08. previous close": "194.2400", "09. change": "2.0800", "10. change percent": "1.0708%"}]}

Вы можете сделать это так:

import json
f = open('data.json',)

meta = json.load(f)
data = meta['Global Quote']

newdf = pd.DataFrame()
for d in data:
    df = pd.DataFrame(d, index=[0])
    newdf = newdf.append(df)
newdf.to_csv('testfile.csv', index = False)

Полученный CSV будет выглядеть как:

01. symbol,02. open,03. high,04. low,05. price,06. volume,07. latest trading day,08. previous close,09. change,10. change percent
MSFT,194.0000,196.4900,194.0000,196.3200,22966814,2020-06-18,194.2400,2.0800,1.0708%
IBM,228.0000,196.4900,194.0000,196.3200,22966814,2020-06-28,194.2400,2.0800,1.0708%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...