Erstellen Pandas Datenrahmen von Smartsheet API (verschachtelt, ungeschickt, JSON)

stimmen
0

Ich versuche, mein Büro Smartsheet API über Python verbinden einige Performance-Tracking-Dashboards zu erstellen, die Daten außerhalb von Smartsheet nutzen. Alles, was ich einen einfachen Datenrahmen tun möge, ist zu erstellen, wo Felder columnid und Zellwerte reflektieren spiegelt die anzeige Schlüssel im Wörterbuch Smartsheet. Ich tue dies einem Standard-API requests.get mit eher als Smartsheet API-Dokumentation, weil ich mit den letzteren weniger leicht zu Arbeit gefunden habe.

Hier sind die beiden Möglichkeiten, wie ich das Problem angesprochen haben:

EINGANG:

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

AUSGABE:

Datenrahmen mit columnid, den Wert, disdlayValue, id und rowNumber als ihre eigenen Felder.

Wenn ich herausfinden kann, wie diese Daten in der richtigen Weise umgesetzt werden könnte ich wahrscheinlich es funktioniert, aber das scheint unglaublich komplizierte.

EINGANG:

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)

AUSGABE:

Dies gibt einen Datenrahmen mit der richtigen Anzahl der Spalten und Zeilen, aber jede Zelle ist mit einem Wörterbuch bevölkert das aussieht

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

Wenn es ein Weg, um alles außer den Wert zu entfernen in jeder Zelle auf die anzeigeSchlüssel entspricht, würde dies wahrscheinlich mein Problem lösen. Auch hier, obwohl, so scheint es seltsam kompliziert.

Ich bin ziemlich neu in Python und mit API arbeiten, so kann es eine einfache Möglichkeit, das Problem zu adressieren ich bin mit Blick auf. Oder wenn Sie einen Vorschlag für die Annäherung an die möglichen Lösungen, die ich oben skizzierte ich bin ganz Ohr. Danke für Ihre Hilfe!

Veröffentlicht am 13/02/2020 um 21:52
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
0

Sie müssen die Verwendung des machen columnsFeld:

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)

Dies gibt wie erwartet:

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

Wenn einige Zellen nur eine columnid aber keine anzeige Feld enthalten könnten, scells['displayValue']sollte in obigem Code ersetzt werden scells.get('displayValue', defaultValue), wo defaultValuekeine sein könnte, np.nanoder jeder anderer relevanter Standard.

Beantwortet am 14/02/2020 um 15:02
quelle vom benutzer

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