Pandas dataframe читает столбец массива в виде строки - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть два скрипта Python, один из которых создает файл .csv, а другой читает его.

Вот как я сохраняю фрейм данных в первом файле:

df['matrix'] = df['matrix'].apply(lambda x: np.array(x))
df.to_csv("Matrices.csv", sep=",", index=False)

Тип и форма df['matrix'].iloc[0] - <class 'numpy.ndarray'> и (24, 60) соответственно.

Во втором сценарии, когда я пытаюсь

print ("type of df['matrix'].iloc[0]", type(df['matrix'].iloc[0]))

Вывод type of df['matrix'].iloc[0] <class 'str'>

Как я могу убедиться, что df['matrix'] не потеряет свою природу?

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Для сохранения массивов непосредственно в csv в виде нескольких столбцов используйте:

np.savetxt(r'C:\path\file.csv',a,delimiter=',')

Если вам нужно считать обратно как объект python, ast.literal_eval() - ваш спаситель, как указано @ jezrael

0 голосов
/ 10 февраля 2019

Если вы хотите сохранять и читать только массив numpy, используйте savetxt и genfromtxt.


Если имеется несколько столбцов, используйте:

Использование pickle :

df.to_pickle('file.pkl')
df = pd.read_pickle('file.pkl')

Преобразование массивов в несколько столбцов и запись в файл:

a = np.array(
[[219,220,221],
 [154,152,14],
 [205,202,192]])

df = pd.DataFrame({'matrix':a.tolist(), 'b':np.arange(len(a))})
print (df)
            matrix  b
0  [219, 220, 221]  0
1   [154, 152, 14]  1
2  [205, 202, 192]  2

df1 = pd.DataFrame(df.pop('matrix').values.tolist(), index=df.index).add_prefix('mat_')
print (df1)
   mat_0  mat_1  mat_2
0    219    220    221
1    154    152     14
2    205    202    192

df = df.join(df1)
print (df)
   b  mat_0  mat_1  mat_2
0  0    219    220    221
1  1    154    152     14
2  2    205    202    192

Но если действительно нужнодля преобразования значений в array нужен конвертер с ast.literal_eval:

import ast

df.to_csv('testing.csv', index=False)

df = pd.read_csv('testing.csv', converters={'matrix':lambda x: np.array(ast.literal_eval(x))})
print (type(df.loc[0, 'matrix']))

<class 'numpy.ndarray'>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...