Pandas Dataframes.to_csv усекает длинные значения - PullRequest
0 голосов
/ 15 ноября 2018

Проблема: Я пытаюсь хранить большие наборы данных, используя кадры данных Pandas в python.Моя проблема в том, что когда я пытаюсь сохранить его в CSV, фрагменты моих данных обрезаются следующим образом:

e + 12

и

[значение1 значение2 значение3 .,. value1853 value1854]

Объяснение: Мне нужно хранить много данных в отдельных ячейках, и некоторые из значений, которые мне нужно сохранить, являются значениями Long (time)и я создал короткий скрипт для отображения ошибок, которые я получаю:

dframe = pd.DataFrame()
arr = np.array([])
for x in range(1234567891230,1234567892230):
    arr = np.append(arr,x)
dframe['elements'] = [arr]
print(dframe['elements'][0][999])   # prints correct values, eg. 1234567892229.0
dframe.to_csv('temp.csv', index=False)

В приведенном выше примере сохраненные значения отображаются , как показано ниже для первых 1000 значений (123456789 1230 до 123456789 2230 )

1.23456789e + 12

, который полностью игнорирует четыре наименее значимых символа.Если вы расширите список до 1001 значения, будет усечено еще больше:

dframe = pd.DataFrame()
arr = np.array([])
for x in range(1234567891230,1234567892231):
    arr = np.append(arr,x)
dframe['elements'] = [arr]
print(dframe['elements'][0][999])   # still prints correct values, eg. 1234567892229.0
dframe.to_csv('temp.csv', index=False)

И полный CSV-файл, наконец, будет выглядеть так:

elements

"[1.23456789e + 12 1.23456789e + 12 1.23456789e + 12 ... 1.23456789e + 12 1.23456789e + 12 1.23456789e + 12] "

, который удалил почти все 1000 элементов и заменил ихпо ... .

Кто-нибудь знает какие-либо обходные пути для этих проблем или как их решить?

Это не проблема усечения просто для отображения (например, Pandas to_html () усекает содержимое строки ), но фактически портит данные, сохраненные в CSV.

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

Итак, реплицируя ваш код на моей машине, я вижу округление, но не усечение списка.

Я не знаю лучшего решения, но вот некоторые предложения

ДелатьВам нужен файл на диске, чтобы он читался человеком?Какая система будет читать это позже?

  • если файл просто перейдет на другой шаг Python, рассмотрите возможность использования вместо pickle
  • рассмотрите возможность превращения вашего списка в строку, у вас есть полный контроль над строкой (например, число явныхдесятичные разряды для каждого значения).Если вы внутренне сохраняете структуру списка без изменений, но просто оборачиваете ее в "", вы можете легко распаковать ее с помощью любого инструмента
0 голосов
/ 15 ноября 2018

Изменение типа данных, как сказал @Jacob Томлинсон, решает одну проблему, а numpys array2string решает другую.

Добавление np.set_printoptions(threshold=np.nan) останавливает to_csv от усечения выходных строк.

dframe = pd.DataFrame()
arr = np.array([])
for x in range(1234567891230,1234567892230):
    arr = np.append(arr,x)
dframe['elements'] = [arr.astype('uint64')]
print(dframe['elements'][0][999])   # prints correct values, eg. 1234567892229.0

np.set_printoptions(threshold=np.nan)
dframe.to_csv('temp.csv', index=False)
0 голосов
/ 15 ноября 2018

Попробуйте установить dtype вашего массива numpy в целое число.

dframe = pd.DataFrame()
arr = np.array([], dtype='int16')
for x in range(1234567891230,1234567892230):
    arr = np.append(arr,x)
dframe['elements'] = [arr]
print(dframe['elements'][0][999])   # prints correct values, eg. 1234567892229.0
dframe.to_csv('temp.csv', index=False)

Элементы

"[1234567891230 1234567891231 1234567891232 ... 1234567891233 1234567891234]"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...