У меня есть фрейм данных pandas со смесью типов данных (dtypes), которые я хочу преобразовать в простой массив (или массив записей, в основном это одно и то же в этом случае).Для чисто числовых фреймов данных это легко сделать с помощью метода to_records()
.Мне также нужно, чтобы dtypes столбцов панд были преобразованы в строки , а не объекты , чтобы я мог использовать метод numpy tofile()
, который будет выводить числа и строки в двоичный файл,но не будет выводить объекты.
В двух словах, мне нужно преобразовать столбцы панд с dtype=object
в пустые структурированные массивы строки или типа unicode.
ВотНапример, с кодом, который был бы достаточен, если бы все столбцы имели числовой тип (float или int) dtype.
df=pd.DataFrame({'f_num': [1.,2.,3.], 'i_num':[1,2,3],
'char': ['a','bb','ccc'], 'mixed':['a','bb',1]})
struct_arr=df.to_records(index=False)
print('struct_arr',struct_arr.dtype,'\n')
# struct_arr (numpy.record, [('f_num', '<f8'), ('i_num', '<i8'),
# ('char', 'O'), ('mixed', 'O')])
Но так как я хочу получить строковые dtypes, мне нужно добавить это дополнительное и несколько сложноекод:
lst=[]
for col in struct_arr.dtype.names: # this was the only iterator I
# could find for the column labels
dt=struct_arr[col].dtype
if dt == 'O': # this is 'O', meaning 'object'
# it appears an explicit string length is required
# so I calculate with pandas len & max methods
dt = 'U' + str( df[col].astype(str).str.len().max() )
lst.append((col,dt))
struct_arr = struct_arr.astype(lst)
print('struct_arr',struct_arr.dtype)
# struct_arr (numpy.record, [('f_num', '<f8'), ('i_num', '<i8'),
# ('char', '<U3'), ('mixed', '<U2')])
См. также: Как изменить dtype некоторых столбцов числового повторного массива?
Это работает, как символ и смешанные dtypes.теперь <U3
и <U2
, а не 'O' или 'object'.Я просто проверяю, есть ли более простой или более элегантный подход.Но поскольку у панд нет собственного типа строки, как у numpy, может быть, нет?