Létrehozása Pandas DataFrame származó SmartSheet API (beágyazott, kényelmetlen, JSON)

szavazat
0

Próbálok csatlakozni a hivatal SmartSheet API-n keresztül Python, hogy egyfajta teljesítmény nyomon követése dashboard adatait is képesek hasznosítani kívül SmartSheet. Csak azt szeretném, hogy hozz létre egy egyszerű DataFrame ahol a mezők tükrözik columnId és cellák értékeit tükrözik a displayValue kulcsot a Smartsheet szótárban. Én ezt egy szabványos API requests.get helyett SmartSheet API dokumentáció mert találtam az utóbbi kevésbé könnyen munkát.

Itt vannak a két módszer, amit megközelíteni a problémát:

BEMENET:

from pandas.io.json import json_normalize
dbopj = dbop.json()
dfj_rows = json_normalize(data=dbopj['rows'], record_path='cells', meta=['id', 'rowNumber'])
dfj_rows

KIMENET:

DataFrame a columnId, érték, disdlayValue, id és rowNumber a saját területén.

Ha tudnék kitalálni, hogyan ültessék az adatokat a megfelelő módon tudnék hogy ez a munka, de úgy tűnik, hihetetlenül bonyolult.

BEMENET:

dbopj = dbop.json()
cellist = []
def get_cells():
    dbrows = dbopj['rows']
    for db_cells in dbrows:
        dbcells = db_cells['cells']
        cellist.append(dbcells)
get_cells()
pd.DataFrame(cellist)

KIMENET:

Ez visszatér a DataFrame a megfelelő számú sorok és oszlopok, hanem minden egyes cella lakott egy szótárt, hogy néz ki

{'columnId': 1500325145274244, 'value': 731.0, 'displayValue': '731'}

Ha van egy módja, hogy távolítsa el mindent, kivéve a megfelelő értékre displayValue kulcs minden sejtben, ez valószínűleg megoldja a problémát. Ismét, bár úgy tűnik, furcsán bonyolult.

Én viszonylag új a Python és dolgozó API, így előfordulhat, hogy egy egyszerű módja annak, hogy a probléma én nyílik. Vagy, ha van egy javaslat közeledik a lehetséges megoldásokat a fentiekben felvázoltam csupa fül vagyok. Köszönöm a segítséget!

A kérdést 13/02/2020 23:52
a forrás felhasználó
Más nyelveken...                            


1 válasz

szavazat
0

Meg kell élni a columnsterületen:

colnames = {x['id']: x['title'] for x in samplej['columns']}
columns = [x['title'] for x in samplej['columns']]
cellist = [{colnames[scells['columnId']]: scells['displayValue']
            for scells in s_cells['cells']} for s_cells in samplej['rows']]
celldf = pd.DataFrame(cellist, columns=columns)

Ez adja a várt módon:

  Number Letter Name
0      1      A  Joe
1      2      B  Jim
2      3      C  Jon

Ha néhány sejtek tartalmaznak egy columnId de nem displayValue területén, scells['displayValue']ki kell cserélni a fent kódot scells.get('displayValue', defaultValue), ahol defaultValuelehet Nincs, np.nanvagy bármely más érintett alapértelmezett.

Válaszolt 14/02/2020 17:02
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more