JSON থেকে পান্ডাস ডেটা ফ্রেম


143

আমি যা করার চেষ্টা করছি তা হ'ল অক্ষাংশ এবং দ্রাঘিমাংশ স্থানাঙ্কগুলি নির্দিষ্ট করে একটি পথ ধরে একটি গুগল ম্যাপস এপিআই থেকে উচ্চতা ডেটা উত্তোলন করতে হবে:

from urllib2 import Request, urlopen
import json

path1 = '42.974049,-81.205203|42.974298,-81.195755'
request=Request('http://maps.googleapis.com/maps/api/elevation/json?locations='+path1+'&sensor=false')
response = urlopen(request)
elevations = response.read()

এটি আমাকে এমন একটি ডেটা দেয় যা দেখে মনে হয়:

elevations.splitlines()

['{',
 '   "results" : [',
 '      {',
 '         "elevation" : 243.3462677001953,',
 '         "location" : {',
 '            "lat" : 42.974049,',
 '            "lng" : -81.205203',
 '         },',
 '         "resolution" : 19.08790397644043',
 '      },',
 '      {',
 '         "elevation" : 244.1318664550781,',
 '         "location" : {',
 '            "lat" : 42.974298,',
 '            "lng" : -81.19575500000001',
 '         },',
 '         "resolution" : 19.08790397644043',
 '      }',
 '   ],',
 '   "status" : "OK"',
 '}']

এখানে ডেটাফ্রেম হিসাবে রাখলে আমি যা পাই তা হ'ল:

এখানে চিত্র বর্ণনা লিখুন

pd.read_json(elevations)

এবং এখানে আমি যা চাই:

এখানে চিত্র বর্ণনা লিখুন

এটি সম্ভব কিনা তা সম্পর্কে আমি নিশ্চিত নই, তবে মূলত আমি যা খুঁজছি তা হ'ল একটি পান্ডাস ডেটা ফ্রেমে উচ্চতা, অক্ষাংশ এবং দ্রাঘিমাংশের ডেটা একসাথে রাখতে সক্ষম হবার উপায় (অভিনব রূপকার শিরোনাম থাকতে হবে না)।

কেউ যদি এই ডেটা নিয়ে কাজ করার বিষয়ে কোনও পরামর্শ বা পরামর্শ দিতে পারে তবে দুর্দান্ত হবে! আপনি যদি বলতে না পারেন আমি এর আগে জসন ডেটা নিয়ে বেশি কাজ করিনি ...

সম্পাদনা করুন:

এই পদ্ধতিটি আকর্ষণীয় নয় তবে কাজ করে বলে মনে হচ্ছে:

data = json.loads(elevations)
lat,lng,el = [],[],[]
for result in data['results']:
    lat.append(result[u'location'][u'lat'])
    lng.append(result[u'location'][u'lng'])
    el.append(result[u'elevation'])
df = pd.DataFrame([lat,lng,el]).T

কলাম অক্ষাংশ, দ্রাঘিমাংশ, উচ্চতা সমাপ্ত ডেটাফ্রেম শেষ হয় me

এখানে চিত্র বর্ণনা লিখুন


হ্যালো বন্ধু, আপনি কীভাবে জসনের টুকরো পেতে জানেন? কিছু subpart?
এম মার্শিসি

উত্তর:


184

আমি যা json_normalize()অন্তর্ভুক্ত ব্যবহার করেছিলাম তার একটি দ্রুত এবং সহজ সমাধান পেয়েছি pandas 1.01

from urllib2 import Request, urlopen
import json

import pandas as pd    

path1 = '42.974049,-81.205203|42.974298,-81.195755'
request=Request('http://maps.googleapis.com/maps/api/elevation/json?locations='+path1+'&sensor=false')
response = urlopen(request)
elevations = response.read()
data = json.loads(elevations)
df = pd.json_normalize(data['results'])

এটি গুগল ম্যাপস এপিআই থেকে জেসন ডেটা পেয়ে একটি দুর্দান্ত সমতল ডেটা ফ্রেম দেয়।


12
এই এখন আর তা কোন কাজ বলে মনে হয় - আমি ব্যবহার ছিল pd.DataFrame.from_records()যেমন এখানে বর্ণিত stackoverflow.com/a/33020669/1137803
· দাবি · সম্পাদনা

4
from_records যদি JSON পর্যাপ্ত জটিল সময়ে কাজ না করে, আপনি json.io.json.json_normalize আবেদন করতে আউট flatmap চেক পেতে আছে stackoverflow.com/questions/39899005/...
devssh

27

এই স্নিপ পরীক্ষা করে দেখুন।

# reading the JSON data using json.load()
file = 'data.json'
with open(file) as train_file:
    dict_train = json.load(train_file)

# converting json dataset from dictionary to dataframe
train = pd.DataFrame.from_dict(dict_train, orient='index')
train.reset_index(level=0, inplace=True)

আশা করি এটা সাহায্য করবে :)


1
ত্রুটি. আপনার ফাইলের বিষয়বস্তু (অর্থাত্ একটি স্ট্রিং) json.loads () এ পাস করতে হবে, ফাইলটি নিজেই নয় - json.load (train_file.read ())
ভাসিন ইউরি

13

আপনি প্রথমে পাইথন ডিকশনারিতে আপনার জসন ডেটা আমদানি করতে পারেন:

data = json.loads(elevations)

তারপরে ফ্লাইতে ডেটা পরিবর্তন করুন:

for result in data['results']:
    result[u'lat']=result[u'location'][u'lat']
    result[u'lng']=result[u'location'][u'lng']
    del result[u'location']

জেসন স্ট্রিং পুনর্নির্মাণ:

elevations = json.dumps(data)

শেষ অবধি:

pd.read_json(elevations)

আপনি, সম্ভবত, কোনও স্ট্রিংয়ে ডেটা ফেলে দিতে এড়াতে পারবেন, আমি ধরে নিয়েছি পান্ডা একটি ডিকশনারি থেকে সরাসরি ডেটা ফ্রেম তৈরি করতে পারে (আমি দীর্ঘদিন থেকে এটি ব্যবহার করি নি: p)


আমি এখনও জাসন ডেটা এবং তৈরি হওয়া অভিধান ব্যবহার করে একই ফলাফলটি শেষ করছি। দেখে মনে হয় ডাটাফ্রেমের প্রতিটি উপাদানটির নিজস্ব ডিক থাকে। আমি 'ডেটা' এর মাধ্যমে পুনরাবৃত্তি করার সময় ল্যাট, এলএনজি এবং উচ্চতার জন্য আলাদা তালিকা তৈরি করার জন্য আপনার দৃষ্টিভঙ্গিটি কম আকর্ষণীয় উপায়ে ব্যবহার করার চেষ্টা করেছি।
প্রব্রিচ

@ user2593236: একটি দেল (উত্তর সম্পাদিত) অনুপস্থিত ছিল: হ্যালো, আমি যখন কপি / তাই আমার কোড পেস্ট করার সময় একটি ত্রুটি করেনি
রাফায়েল Braud

হুম .. এখনও একই জিনিস যেখানে এটির 'ফলাফল' এবং শিরোনাম হিসাবে 'স্থিতি' রয়েছে যখন বাকি জসন ডেটা প্রতিটি কক্ষে ডিক্ট হিসাবে উপস্থিত হয়। আমি মনে করি যে এই সমস্যার সমাধানটি হ'ল ডেটা ফর্ম্যাটটি পরিবর্তন করা যাতে এটি 'ফলাফল' এবং 'স্থিতিতে' বিভক্ত না হয় তবে ডেটা ফ্রেমটি 'ল্যাট', 'এলএনজি', 'উচ্চতা', ' রেজোলিউশন 'পৃথক শিরোনাম হিসাবে। হয় যেটি হয়, বা আমি প্রশ্নটিতে উল্লিখিত হিসাবে আমার কাছে একটি ডাটাফ্রেমে জেএসন ডেটা লোড করার একটি উপায় খুঁজে বের করতে হবে যেটিতে একটি মাল্টিলেভেল শিরোনাম সূচক থাকবে।
প্রব্রিচ

আপনি কোন চূড়ান্ত সারণী আশা করবেন? আপনার সম্পাদনার পরে আপনি কি পেয়েছেন?
রাফাল ব্রাড 14'14

আমার চূড়ান্ত সম্পাদনার পরে আমি যেটি পেয়েছি তা কাজ করে, মূলত আমার যা দরকার তা হ'ল আমি যে
টেবিলার

9

শুধু গৃহীত উত্তর এর একটি নতুন সংস্করণ, যেমন python3.xসমর্থন করে নাurllib2

from requests import request
import json
from pandas.io.json import json_normalize

path1 = '42.974049,-81.205203|42.974298,-81.195755'
response=request(url='http://maps.googleapis.com/maps/api/elevation/json?locations='+path1+'&sensor=false', method='get')
elevations = response.json()
elevations
data = json.loads(elevations)
json_normalize(data['results'])

4

সমস্যাটি হ'ল ডেটা ফ্রেমে আপনার বেশ কয়েকটি কলাম রয়েছে যাতে সেগুলির ভিতরে ছোট ডিক্টস সহ ডিকট থাকে। দরকারী জসন প্রায়শই ভারী বাসা বেঁধে থাকে। আমি ছোট ফাংশনগুলি লিখছি যা আমি চাই নতুন তথ্যটি কলামে টানতে চাই। আমি যে ফর্ম্যাটটি ব্যবহার করতে চাই সেভাবে এটি আমার কাছে রয়েছে।

for row in range(len(data)):
    #First I load the dict (one at a time)
    n = data.loc[row,'dict_column']
    #Now I make a new column that pulls out the data that I want.
    data.loc[row,'new_column'] = n.get('key')

4

গৃহীত উত্তরের অনুকূলিতকরণ:

গৃহীত উত্তরের কিছু কার্যক্ষম সমস্যা রয়েছে, তাই আমি আমার কোডটি ভাগ করতে চাই যা urllib2 এর উপর নির্ভর করে না:

import requests
from pandas.io.json import json_normalize
url = 'https://www.energidataservice.dk/proxy/api/datastore_search?resource_id=nordpoolmarket&limit=5'

r = requests.get(url)
dictr = r.json()
recs = dictr['result']['records']
df = json_normalize(recs)
print(df)

আউটপুট:

        _id                    HourUTC               HourDK  ... ElbasAveragePriceEUR  ElbasMaxPriceEUR  ElbasMinPriceEUR
0    264028  2019-01-01T00:00:00+00:00  2019-01-01T01:00:00  ...                  NaN               NaN               NaN
1    138428  2017-09-03T15:00:00+00:00  2017-09-03T17:00:00  ...                33.28              33.4              32.0
2    138429  2017-09-03T16:00:00+00:00  2017-09-03T18:00:00  ...                35.20              35.7              34.9
3    138430  2017-09-03T17:00:00+00:00  2017-09-03T19:00:00  ...                37.50              37.8              37.3
4    138431  2017-09-03T18:00:00+00:00  2017-09-03T20:00:00  ...                39.65              42.9              35.3
..      ...                        ...                  ...  ...                  ...               ...               ...
995  139290  2017-10-09T13:00:00+00:00  2017-10-09T15:00:00  ...                38.40              38.4              38.4
996  139291  2017-10-09T14:00:00+00:00  2017-10-09T16:00:00  ...                41.90              44.3              33.9
997  139292  2017-10-09T15:00:00+00:00  2017-10-09T17:00:00  ...                46.26              49.5              41.4
998  139293  2017-10-09T16:00:00+00:00  2017-10-09T18:00:00  ...                56.22              58.5              49.1
999  139294  2017-10-09T17:00:00+00:00  2017-10-09T19:00:00  ...                56.71              65.4              42.2 

PS: API ডেনিশ বিদ্যুতের দামের জন্য


3

এখানে একটি ছোট্ট ইউটিলিটি ক্লাস যা JSON কে ডেটাফ্রেমে এবং পিছনে রূপান্তর করে: আশা করি আপনি এটি সহায়ক পেয়েছেন।

# -*- coding: utf-8 -*-
from pandas.io.json import json_normalize

class DFConverter:

    #Converts the input JSON to a DataFrame
    def convertToDF(self,dfJSON):
        return(json_normalize(dfJSON))

    #Converts the input DataFrame to JSON 
    def convertToJSON(self, df):
        resultJSON = df.to_json(orient='records')
        return(resultJSON)

1

বিলেম্যানএইচ এর সমাধান আমাকে সাহায্য করেছে তবে আমি স্যুইচ না করা পর্যন্ত কাজ করে নি:

n = data.loc[row,'json_column']

প্রতি:

n = data.iloc[[row]]['json_column']

এটির বাকী অংশটি এখানে, অভিধানে রূপান্তর করা জাসন ডেটা নিয়ে কাজ করার জন্য সহায়ক।

import json

for row in range(len(data)):
    n = data.iloc[[row]]['json_column'].item()
    jsonDict = json.loads(n)
    if ('mykey' in jsonDict):
        display(jsonDict['mykey'])

1
#Use the small trick to make the data json interpret-able
#Since your data is not directly interpreted by json.loads()

>>> import json
>>> f=open("sampledata.txt","r+")
>>> data = f.read()
>>> for x in data.split("\n"):
...     strlist = "["+x+"]"
...     datalist=json.loads(strlist)
...     for y in datalist:
...             print(type(y))
...             print(y)
...
...
<type 'dict'>
{u'0': [[10.8, 36.0], {u'10': 0, u'1': 0, u'0': 0, u'3': 0, u'2': 0, u'5': 0, u'4': 0, u'7': 0, u'6': 0, u'9': 0, u'8': 0}]}
<type 'dict'>
{u'1': [[10.8, 36.1], {u'10': 0, u'1': 0, u'0': 0, u'3': 0, u'2': 0, u'5': 0, u'4': 0, u'7': 0, u'6': 0, u'9': 0, u'8': 0}]}
<type 'dict'>
{u'2': [[10.8, 36.2], {u'10': 0, u'1': 0, u'0': 0, u'3': 0, u'2': 0, u'5': 0, u'4': 0, u'7': 0, u'6': 0, u'9': 0, u'8': 0}]}
<type 'dict'>
{u'3': [[10.8, 36.300000000000004], {u'10': 0, u'1': 0, u'0': 0, u'3': 0, u'2': 0, u'5': 0, u'4': 0, u'7': 0, u'6': 0, u'9': 0, u'8': 0}]}
<type 'dict'>
{u'4': [[10.8, 36.4], {u'10': 0, u'1': 0, u'0': 0, u'3': 0, u'2': 0, u'5': 0, u'4': 0, u'7': 0, u'6': 0, u'9': 0, u'8': 0}]}
<type 'dict'>
{u'5': [[10.8, 36.5], {u'10': 0, u'1': 0, u'0': 0, u'3': 0, u'2': 0, u'5': 0, u'4': 0, u'7': 0, u'6': 0, u'9': 0, u'8': 0}]}
<type 'dict'>
{u'6': [[10.8, 36.6], {u'10': 0, u'1': 0, u'0': 0, u'3': 0, u'2': 0, u'5': 0, u'4': 0, u'7': 0, u'6': 0, u'9': 0, u'8': 0}]}
<type 'dict'>
{u'7': [[10.8, 36.7], {u'10': 0, u'1': 0, u'0': 0, u'3': 0, u'2': 0, u'5': 0, u'4': 0, u'7': 0, u'6': 0, u'9': 0, u'8': 0}]}
<type 'dict'>
{u'8': [[10.8, 36.800000000000004], {u'1': 0, u'0': 0, u'3': 0, u'2': 0, u'5': 0, u'4': 0, u'7': 0, u'6': 0, u'9': 0, u'8': 0}]}
<type 'dict'>
{u'9': [[10.8, 36.9], {u'1': 0, u'0': 0, u'3': 0, u'2': 0, u'5': 0, u'4': 0, u'7': 0, u'6': 0, u'9': 0, u'8': 0}]}


1

একবার আপনি DataFrameগৃহীত উত্তরের দ্বারা সমতল হয়ে গেলে , আপনি কলামগুলিকে একটি MultiIndex("অভিনব মাল্টলাইন শিরোনাম") এর মতো করে তুলতে পারেন :

df.columns = pd.MultiIndex.from_tuples([tuple(c.split('.')) for c in df.columns])
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.