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?

0
HappyPy 7 Апр 2020 в 06:30
to_csv записывает представление str в файл. Для списка с «[1,2]» для ndarray «[1 2]». При загрузке оба будут строками. Таким образом, csv не является хорошим форматом для сохранения этого фрейма данных.
 – 
hpaulj
7 Апр 2020 в 06:47
Если вам нужен текстовый файл, вы также можете использовать df.to_json(fn)`` and then read it back with pd.read_json(fn)``` CSV на самом деле не предназначен для вложенных структур данных.
 – 
Eric Truett
7 Апр 2020 в 06:49

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. Хранение списков или массивов в элементе — это дополнительный уровень вложенности, который плохо подходит для этого формата.

0
hpaulj 7 Апр 2020 в 07:05