Как конвертировать Json в панды по условию

У меня есть следующий Джейсон:

{'ADA': {'free': '0.00000000', 'locked': '1.32580000'},
 'ADX': {'free': '15.0000000', 'locked': '0.00000000'},
 'AE': {'free': '0.23000000', 'locked': '1.253000000'},
 'ZRX': {'free': '0.00000000', 'locked': '0.00000000'}}

Я пытаюсь преобразовать вышеупомянутого Джейсона в панд, но только строки с суммой <> 0 в «бесплатно» или в «заблокировано» + без «0», когда они не нужны, поэтому ZRX в отношении приведенного выше примера не будет отображаться и 1.2530000 будет всего 1.253

Моими желаемыми пандами будут:

    free   locked
ADA 0      1.3258
ADX 15     0
AE  0.23   1.253

Спасибо за помощь!

Покажите, что вы пробовали.

giraffesyo 07.04.2019 15:03

Джейсон? Вы имеете в виду JSON?

m0skit0 07.04.2019 15:55
2
2
373
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я считаю, что вам сначала нужно DataFrame.from_dict, затем преобразовать в числа с плавающей запятой и отфильтровать по Series.ne с boolean indexing, последним для строк без трейлинга 0 используйте это решение:

d =  {'ADA': {'free': '0.00000000', 'locked': '1.32580000'},
 'ADX': {'free': '15.0000000', 'locked': '0.00000000'},
 'AE': {'free': '0.23000000', 'locked': '1.253000000'},
 'ZRX': {'free': '0.00000000', 'locked': '0.00000000'}}

df = pd.DataFrame.from_dict(d,orient='index')

df = df.astype(float)

df = df[df['free'].ne(0) | df['locked'].ne(0)].applymap('{0:g}'.format)
#if need remove 0 from all rows
#df = df[df.ne(0).any(axis=1)].applymap('{0:g}'.format)
print (df)
     free  locked
ADA     0  1.3258
ADX    15       0
AE   0.23   1.253

почему при попытке сделать free+locked я получаю только free? даже после того, как я изменю df на float?

Giladbi 08.04.2019 10:10

@Giladbi - Не уверен, что понял, можешь объяснить подробнее? Как вы получаете значения? Если проверить print (df.dtypes), нет ли обоих столбцов с плавающей запятой?

jezrael 08.04.2019 10:12

это объект. Я меняю его на «df = df.astype(float)» и все равно получаю a+b =a или b+a =b

Giladbi 08.04.2019 10:36

@Giladbi - Данные конфиденциальны?

jezrael 08.04.2019 10:48

Я добавил «баланс ['Общая позиция'] = (баланс ['заблокировано']) + (баланс ['свободно'])», и результаты: свободно заблокировано Общая позиция AAA 2,99831 0 02,99831

Giladbi 08.04.2019 11:16

Столбцы данных (всего 3 столбца): свободные 7 непустых объектов заблокированы 7 непустых объектов Общая позиция 7 непустых объектов dtypes: object(3)

Giladbi 08.04.2019 11:17

@Giladbi - Итак, я думаю, проблема в applymap('{0:g}'.format) - он преобразует числа с плавающей запятой в строки. Так что нужно df = df.astype(float) а потом df['Total Position'] = (df['locked']) + (df['free']) и последнее df = df[df['free'].ne(0) | df['locked'].ne(0)].applymap('{0:g}'.format)

jezrael 08.04.2019 11:19

Вы можете использовать:

json = {'ADA': {'free': '0.00000000', 'locked': '1.32580000'},
 'ADX': {'free': '15.0000000', 'locked': '0.00000000'},
 'AE': {'free': '0.23000000', 'locked': '1.253000000'},
 'ZRX': {'free': '0.00000000', 'locked': '0.00000000'}}

df = pd.DataFrame.from_dict(json).astype(float).transpose()
df = df.applymap(lambda s: str(s).rstrip('0').rstrip('.') if '.' in str(s) else s)
df = df[~((df['free']=='0') & (df['locked']=='0'))]   # This is to drop row containing all zeros
print(df)



     free  locked
ADA     0  1.3258
ADX    15       0
AE   0.23   1.253

Другие вопросы по теме