Преобразование панд DF в JSON без NAN - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть DF, который выглядит примерно так:

A    B    C    D    E
1    1    NaN  1    1
NaN  2    3    4    NaN

Когда я делаю:

df.to_json(orient='records')

Я получаю что-то вроде

[{"A":1,"B":1,"C":null,"D":1,"E":1},{"A":null,"B":2,"C":3,"D":4,"E":null}]

Есть ли в любом случаезаставить его игнорировать все, что имеет NaN, и показать что-то вроде:

[{"A":1,"B":1,"D":1,"E":1},{"B":2,"C":3,"D":4}]

Могу ли я сделать это с помощью панд?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Попробуйте:

[{**x[i]} for i, x in df.stack().groupby(level=0)]

[{'A': 1.0, 'B': 1.0, 'D': 1.0, 'E': 1.0}, {'B': 2.0, 'C': 3.0, 'D': 4.0}]

Если вы хотите int

[{**x[i]} for i, x in df.stack().map(int).groupby(level=0)]

[{'A': 1, 'B': 1, 'D': 1, 'E': 1}, {'B': 2, 'C': 3, 'D': 4}]

Хакерский способ сохранить int, если они int

[{**x[i]} for i, x in df.stack().fillna(0, downcast='infer').groupby(level=0)]

[{'A': 1, 'B': 1, 'D': 1, 'E': 1}, {'B': 2, 'C': 3, 'D': 4}]

Пояснение

#    Series with a
#       MultiIndex       Make a Series and drop nulls
#                ↓       ↓                     ↓ Essentially grouping by `index` of `df`
[{**x[i]} for i, x in df.stack().groupby(level=0)]
# ↑   ↑
# ↑   Slice the MultiIndex with name of the group
# Unpack in a dictionary context with double splat `{**mydict} == mydict`
0 голосов
/ 25 сентября 2018

Вот предыдущий ответ для удаления диктонарных ключей, когда их значения равны нулю:

{k: v for k, v in metadata.items() if v is not None}

https://stackoverflow.com/a/12118700/8265971

Для панд есть функция pandas.DataFrame.dropna.Если эти значения будут назначены столбцу, это будет хорошо работать: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...