Vytváření pandy datový rámec z Smartsheet API (vnořené, trapné, JSON)

hlasů
0

Snažím se připojit k mé kanceláři je Smartsheet API přes Python vytvořit některé panelů pro sledování výkonu, které využívají dat mimo Smartsheet. Všechno, co chci udělat, je vytvořit jednoduchý datovém kde pole odrážet columnId a hodnoty buněk odráží klíč displayValue v Smartsheet slovníku. Dělám to s použitím spíše než standardní API requests.get dokumentaci API Smartsheet, protože jsem zjistil, druhý méně snadné s ním pracovat.

Zde jsou dva způsoby, jak jsem se blížil k problému:

VSTUP:

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

VÝSTUP:

Datový rámec s columnId, hodnoty, disdlayValue, id, a RowNumber as svých oborech.

Pokud bych mohl přijít na to, jak provést tuto údaje správným způsobem mohl bych asi aby to fungovalo, ale to se zdá neuvěřitelně komplikované.

VSTUP:

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)

VÝSTUP:

Tento Vrátí datovém s správný počet sloupců a řádků, ale každá buňka je naplněna slovníku, který vypadá

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

Kdyby tam byl způsob, jak odstranit vše kromě hodnoty odpovídající displayValue klíč v každé buňce, by to pravděpodobně vyřešit můj problém. Opět platí, že i když, jak se zdá podivně složité.

Jsem docela nový Python a práce s API, takže tam může být jednoduchý způsob, jak řešit problém jsem s výhledem. Nebo, pokud máte nějaký návrh na blížící se možná řešení I popsané výše Jsem jedno ucho. Díky za vaši pomoc!

Položena 13/02/2020 v 23:52
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
0

Je nutné využít columnspole:

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)

To dává podle očekávání:

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

Pokud jsou některé buňky mohou obsahovat pouze columnId ale ne pole displayValue, scells['displayValue']musí být vyměněn při výše uvedeném kódu se scells.get('displayValue', defaultValue), kde defaultValueby mohl být žádná, np.nannebo jakýkoli jiný relevantní default.

Odpovězeno 14/02/2020 v 17:02
zdroj uživatelem

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