python - Pandas: Transmitir columna a cadena no funciona
(1)
Tengo un dataframe
resultstatsDF
resultstatsDF = DataFrame({''a'': [1,2,3,4,5]})
resultstatsDF[''file''] = ''asdf''
resultstatsDF.dtypes
a int64
file object
dtype: object
con el
file
columna de
object
que me gustaría convertir en cadena:
Lo intenté
resultstatsDF = resultstatsDF.astype({''file'': str})
resultstatsDF[''file''] = resultstatsDF[''file''].astype(str)
resultstatsDF[''file''] = resultstatsDF[''file''].to_string
resultstatsDF[''file''] = resultstatsDF.file.apply(str)
resultstatsDF[''file''] = resultstatsDF[''file''].apply(str)
pero haga lo que haga, cuando verifique con
resultstatsDF.dtypes
el
file
columna permanece para ser del
object
tpye.
dtype
de
string
,
dict
,
list
siempre es
object
, para el
type
prueba necesita seleccionar algún valor de columna, por ejemplo, por
iat
:
type(resultstatsDF[''file''].iat[0])
Muestra:
resultstatsDF = pd.DataFrame({''file'':[''a'',''d'',''f'']})
print (resultstatsDF)
file
0 a
1 d
2 f
print (type(resultstatsDF[''file''].iloc[0]))
<class ''str''>
print (resultstatsDF[''file''].apply(type))
0 <class ''str''>
1 <class ''str''>
2 <class ''str''>
Name: file, dtype: object
Muestra:
df = pd.DataFrame({''strings'':[''a'',''d'',''f''],
''dicts'':[{''a'':4}, {''c'':8}, {''e'':9}],
''lists'':[[4,8],[7,8],[3]],
''tuples'':[(4,8),(7,8),(3,)],
''sets'':[set([1,8]), set([7,3]), set([0,1])] })
print (df)
dicts lists sets strings tuples
0 {''a'': 4} [4, 8] {8, 1} a (4, 8)
1 {''c'': 8} [7, 8] {3, 7} d (7, 8)
2 {''e'': 9} [3] {0, 1} f (3,)
Todos los valores tienen los mismos
dtypes
:
print (df.dtypes)
dicts object
lists object
sets object
strings object
tuples object
dtype: object
Pero el
type
es diferente, si es necesario, verifíquelo por bucle:
for col in df:
print (df[col].apply(type))
0 <class ''dict''>
1 <class ''dict''>
2 <class ''dict''>
Name: dicts, dtype: object
0 <class ''list''>
1 <class ''list''>
2 <class ''list''>
Name: lists, dtype: object
0 <class ''set''>
1 <class ''set''>
2 <class ''set''>
Name: sets, dtype: object
0 <class ''str''>
1 <class ''str''>
2 <class ''str''>
Name: strings, dtype: object
0 <class ''tuple''>
1 <class ''tuple''>
2 <class ''tuple''>
Name: tuples, dtype: object
O primer valor de columnas:
print (type(df[''strings''].iat[0]))
<class ''str''>
print (type(df[''dicts''].iat[0]))
<class ''dict''>
print (type(df[''lists''].iat[0]))
<class ''list''>
print (type(df[''tuples''].iat[0]))
<class ''tuple''>
print (type(df[''sets''].iat[0]))
<class ''set''>
Con la
boolean indexing
si es posible una columna mixta (entonces se pueden romper algunas funciones de pandas), es posible filtrar por
type
:
df = pd.DataFrame({''mixed'':[''3'', 5, 9,''2'']})
print (df)
mixed
0 3
1 5
2 9
3 2
print (df.dtypes)
mixed object
dtype: object
for col in df:
print (df[col].apply(type))
0 <class ''str''>
1 <class ''int''>
2 <class ''int''>
3 <class ''str''>
Name: mixed, dtype: object
#python 3 - string
#python 2 - basestring
mask = df[''mixed''].apply(lambda x: isinstance(x,str))
print (mask)
0 True
1 False
2 False
3 True
Name: mixed, dtype: bool
df = df[mask]
print (df)
mixed
0 3
3 2