df1 = pd.DataFrame({'x':'ble','y':[[1,2]]})
df2 = pd.DataFrame({'x':'bla','y':[np.array([1,2])]})
df1.to_csv('df1.csv', sep='\t')
df2.to_csv('df2.csv', sep='\t')
df1.csv
сохранит запятые
x y
ble [1, 2]
Но df2.csv
не будет
x y
bla [1 2]
Кадры данных затем объединяются (df3.csv
)
x y
ble [1,2]
bla [1 2]
Позже я прочитал df3.csv
в python и преобразовал y
обратно в списки с помощью ast._literal_eval
, но это не сработает для второй строки. Могу ли я как-то указать to_csv
включать запятые независимо от того, является ли это списком Python или массивом numpy?
1 ответ
Вы просто видите разницу в представлении str
двух классов:
In [215]: print([1,2])
[1, 2]
In [216]: print(np.array([1,2]))
[1 2]
В одном из ваших тестов массив встраивается в список с другим представлением:
In [227]: pd.__version__
Out[227]: '0.25.3'
In [228]: df=pd.DataFrame([{'x':'ble','y':[[1,2]]},
...: {'x':'bla','y':[np.array([1,2])]},
...: {'x':'bli','y':np.array([1,2])}
...: ])
In [229]: df
Out[229]:
x y
0 ble [[1, 2]]
1 bla [[1, 2]]
2 bli [1, 2]
In [230]: df.to_csv('test.csv')
In [231]: cat test.csv
,x,y
0,ble,"[[1, 2]]"
1,bla,"[array([1, 2])]"
2,bli,[1 2]
Вы должны to_csv
, но, похоже, у нас нет точного контроля над этим. Помните, что csv
предназначен для хранения простых таблиц, строк столбцов. Так же и DataFrame. Хранение списков или массивов в элементе — это дополнительный уровень вложенности, который плохо подходит для этого формата.
Похожие вопросы
Новые вопросы
python
Python — это мультипарадигмальный многоцелевой язык программирования с динамической типизацией. Он предназначен для быстрого изучения, понимания и использования, а также обеспечивает чистый и унифицированный синтаксис. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Если у вас есть вопросы о версии Python, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas, NumPy) укажите это в тегах.
to_pickle
a> для хранения объектов python для надежных данных:df1.to_pickle('df1.pkl')
df2.to_pickle('df2.pkl')
и чтения с использованиемpd.read_pickle('df2.pkl')
, таким образом вам не придется делатьast.literal_eval
, так как он будет хранить список как список и массив как массив, но, пожалуйста, просмотрите предупреждения, как указано здесьto_csv
записывает представлениеstr
в файл. Для списка с «[1,2]» для ndarray «[1 2]». При загрузке оба будут строками. Таким образом,csv
не является хорошим форматом для сохранения этого фрейма данных.df.to_json(fn)`` and then read it back with
pd.read_json(fn)``` CSV на самом деле не предназначен для вложенных структур данных.