Tworzenie pandy DataFrame z Smartsheet API (zagnieżdżone, niezgrabny, JSON)

głosy
0

Próbuję połączyć się z urzędu Smartsheet API poprzez Pythonie, aby utworzyć kilka śledzenia wydajności pulpitów, które wykorzystują zewnątrz danych Smartsheet. Wszystko co chcę zrobić, to stworzyć prosty DataFrame gdzie pola refleksji ColumnID i wartości komórek odzwierciedlać klucz displayValue w słowniku Smartsheet. Robię to za pomocą standardowego API requests.get zamiast dokumentacji API Smartsheet ponieważ znalazłem ten ostatni mniej wygodny w użyciu.

Oto dwa sposoby ja podszedł do problemu:

WEJŚCIE:

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

WYNIK:

DataFrame z ColumnID, wartości, disdlayValue, ID, a RowNumber jako swoich dziedzinach.

Gdybym mógł dowiedzieć się, jak przenieść te dane w odpowiedni sposób pewnie mógłby uczynić to działa, ale to wydaje się niezwykle skomplikowane.

WEJŚCIE:

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)

WYNIK:

Zwraca DataFrame z poprawną liczbę kolumn i wierszy, ale każda komórka jest wypełniana ze słownikiem, który wygląda jak

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

Jeżeli istnieje sposób, aby usunąć wszystko z wyjątkiem wartości odpowiadającej klucza displayValue w każdej komórce, to prawdopodobnie rozwiąże mój problem. Ponownie, choć wydaje się dziwnie skomplikowane.

Jestem całkiem nowy, Python i pracy z API, więc nie może być w prosty sposób rozwiązać ten problem mam z widokiem. Albo, jeśli masz sugestie zbliża się do możliwych rozwiązań przedstawionych powyżej ja jestem wszystkich uszy. Dzięki za pomoc!

Utwórz 13/02/2020 o 21:52
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
0

Należy skorzystać z columnspola:

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)

Daje to zgodnie z oczekiwaniami:

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

Jeśli niektóre komórki mogą zawierać tylko ColumnID ale nie pole displayValue, scells['displayValue']powinna zostać zastąpiona w powyższym kodzie z scells.get('displayValue', defaultValue), gdzie defaultValuemógłby być brak, np.nanlub wszelkie inne istotne domyślna.

Odpowiedział 14/02/2020 o 15:02
źródło użytkownik

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