Панды: принудительное использование типов dtypes фреймов данных в json со строками=True

#python #pandas

Вопрос:

Я нашел вывод типа Панды полной болью в спине, но, короче говоря, как мне сохранить значения в виде строк и не изменять их при чтении JSON с lines=True помощью ?

 >>> df = pd.DataFrame({'A': ['01','02','03'], 'B': [True, False, False], 'C': ['a', 'b', 'c']}, dtype=str)
>>> df
    A      B  C
0  01   True  a
1  02  False  b
2  03  False  c
>>> df.to_json(open('1.json', 'w'), orient='records', lines=True)
>>> pd.read_json('1.json', lines=True)
   A      B  C
0  1   True  a
1  2  False  b
2  3  False  c
 

Вы можете видеть, что начальные нули удалены из столбца A .
Я работаю в более крупном проекте, где есть много столбцов, которые меня не волнуют, но я не хочу менять их, как A в приведенной выше колонке.
Как мне это сделать?

Я также не хочу меняться lines=True , потому что тогда файл станет одной строкой и нечитаемым.

Комментарии:

1. Раньше у меня была та же проблема при записи моих df в csv, одна вещь, которую я делал, состояла в том, чтобы преобразовать их в тип str и записать в csv. Когда я читаю этот csv, я обязательно конвертирую его обратно в исходный тип

2. Нет, подождите, мой плохой, похоже, что ваш ввод уже является str, если затем попробуйте преобразовать его в тип «obj»

Ответ №1:

Используйте dtype={"Col_Name": object} при чтении json

Экс:

 df = pd.DataFrame({'A': ['01','02','03'], 'B': [True, False, False], 'C': ['a', 'b', 'c']}, dtype=str)
df.to_json('1.json', orient='records', lines=True)
print(pd.read_json('1.json', lines=True, dtype={"A": object}))
 

Выход:

     A      B  C
0  01   True  a
1  02  False  b
2  03  False  c
 

Комментарии:

1. Спасибо. Поскольку я не знаю имен столбцов, похоже, что настройка dtype=object работает для всех столбцов

2. Пожалуйста, обратите внимание, что это приведет к преобразованию всех столбцов в «str». Например, если у вас есть столбец int , который также будет преобразован в str

3. Это лучше, чем другой способ, но возможно ли сделать так, чтобы это просто ничего не меняло? В идеале запуск read_json/to_json не изменит файл.