Opprette Pandaer DataFrame fra Smartsheet API (nestet, vanskelig, JSON)

stemmer
0

Jeg prøver å koble til min kontorets Smartsheet API via Python for å lage noen ytelse sporing oversikter som benytter data utenfor Smartsheet. Alt jeg vil gjøre er å lage en enkel DataFrame hvor felt reflektere columnId og celleverdier reflekterer displayValue nøkkelen i Smart ordbok. Jeg gjør dette ved hjelp av en standard API requests.get snarere enn Smartsheet API dokumentasjon fordi jeg har funnet den sistnevnte mindre lett å arbeide med.

Her er de to måtene jeg har nærmet problemet:

INNGANG:

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

PRODUKSJON:

DataFrame med columnId, verdi, disdlayValue, id, og ROWNUMBER som sine egne felt.

Hvis jeg kunne finne ut hvordan å transponere disse dataene på den rette måten jeg kunne sikkert gjøre det, men det virker utrolig komplisert.

INNGANG:

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)

PRODUKSJON:

Dette returnerer en DataFrame med riktig antall kolonner og rader, men hver celle er befolket med en ordbok som ser ut som

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

Hvis det var en måte å fjerne alt unntatt verdien tilsvarer den displayValue nøkkelen i hver celle, vil dette trolig løse mitt problem. Igjen, skjønt, det synes nifs komplisert.

Jeg er ganske ny på Python og arbeide med API-er, så det kan være en enkel måte å løse problemet jeg utsikt. Eller, hvis du har et forslag for nærmer de mulige løsningene jeg skissert ovenfor er jeg lutter øre. Takk for hjelpen!

Publisert på 13/02/2020 klokken 23:52
kilden bruker
På andre språk...                            


1 svar

stemmer
0

Du må gjøre bruk av columnsfeltet:

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)

Dette gir som forventet:

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

Hvis noen celler kan inneholde bare en columnId men ingen displayValue feltet, scells['displayValue']skal erstattes i koden ovenfor med scells.get('displayValue', defaultValue), der defaultValuekan være ingen, np.naneller annen relevant standard.

Svarte 14/02/2020 kl. 17:02
kilden bruker

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