Построить CSV со строками массива:
In [385]: arr = np.empty(1, object)
In [386]: arr[0]=np.arange(12).reshape(3,4)
In [387]: S = pd.Series(arr,name='x')
In [388]: S
Out[388]:
0 [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]
Name: x, dtype: object
In [389]: S.to_csv('series.csv')
/usr/local/bin/ipython3:1: FutureWarning: The signature of `Series.to_csv` was aligned to that of `DataFrame.to_csv`, and argument 'header' will change its default value from False to True: please pass an explicit value to suppress this warning.
#!/usr/bin/python3
In [390]: cat series.csv
0,"[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]"
загрузить его:
In [391]: df = pd.read_csv('series.csv',header=None)
In [392]: df
Out[392]:
0 1
0 0 [[ 0 1 2 3]\n [ 4 5 6 7]\n [ 8 9 10 11]]
In [394]: astr=df[1][0]
In [395]: astr
Out[395]: '[[ 0 1 2 3]\n [ 4 5 6 7]\n [ 8 9 10 11]]'
разобрать строковое представление массива:
In [396]: astr.split('\n')
Out[396]: ['[[ 0 1 2 3]', ' [ 4 5 6 7]', ' [ 8 9 10 11]]']
In [398]: astr.replace('[','').replace(']','').split('\n')
Out[398]: [' 0 1 2 3', ' 4 5 6 7', ' 8 9 10 11']
In [399]: [i.split() for i in _]
Out[399]: [['0', '1', '2', '3'], ['4', '5', '6', '7'], ['8', '9', '10', '11']]
In [400]: np.array(_, int)
Out[400]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
Нет гарантии что это самый красивый и чистый анализ, но он дает представление о работе, которую вы должны сделать. Я заново изобретаю колесо, но поиск дубликата занял слишком много времени.
Если возможно, попытайтесь избежать сохранения такого кадра данных, как csv. Формат CSV предназначен для чистой 2-мерной таблицы, простых непротиворечивых столбцов, разделенных разделителем.
И по большей части избегайте подобных фреймов / серий. Серия может иметь объект dtype. И каждый элемент объекта может быть сложным, например, список, словарь или массив. Но я не думаю, что pandas
имеет специальные функции для обработки этих случаев.
numpy
также имеет dtypes объекта (как мой arr
), но список часто так же хорош, если не лучше , Построить такой массив может быть сложно. Математика на таком массиве является хитом или мисс. Итерация в массиве объектов медленнее, чем итерация в списке.
===
re
также может работать. Например, заменить пробел запятой:
In [408]: re.sub('\s+',',',astr)
Out[408]: '[[,0,1,2,3],[,4,5,6,7],[,8,9,10,11]]'
Все еще не совсем верно. Есть ведущие запятые, которые душат eval
.