Во-первых, dtype
для этих столбцов (Series) равно object
. Он может содержать строки, списки, числа и т. Д. c. Обычно все они выглядят одинаково, потому что pandas опускает кавычки. pandas не использует строковые dtypes numpy
.
df[col].to_numpy()
кажется хорошим способом увидеть, каковы фактические элементы Series.
Если столбец содержит списки, tocsv()
записывает str(alist)
версию списка (или других объектов). Читатель csv загружает их как строки; он не пытается их разбирать. Посмотрите на csv
и снова проверьте серию to_numpy()
.
Серия, содержащую списки:
In [377]: s = pd.Series([[1,2,3],[4,5,6]])
In [378]: s
Out[378]:
0 [1, 2, 3]
1 [4, 5, 6]
dtype: object
In [379]: s.to_numpy()
Out[379]: array([list([1, 2, 3]), list([4, 5, 6])], dtype=object)
Запись в файл:
In [380]: s.to_csv('test.csv', index=False)
In [381]: cat test.csv
0
"[1, 2, 3]"
"[4, 5, 6]"
чтение из файла:
In [382]: df = pd.read_csv('test.csv')
In [383]: df
Out[383]:
0
0 [1, 2, 3]
1 [4, 5, 6]
In [384]: df.to_numpy()
Out[384]:
array([['[1, 2, 3]'],
['[4, 5, 6]']], dtype=object)
Обратите внимание на изменение строк.
applying
eval
для каждой строки столбца:
In [389]: df1 = df['0'].apply(eval)
In [390]: df1
Out[390]:
0 [1, 2, 3]
1 [4, 5, 6]
Name: 0, dtype: object
In [391]: df1.to_numpy()
Out[391]: array([list([1, 2, 3]), list([4, 5, 6])], dtype=object)
Может быть что-то лучше, но это по крайней мере начало.