from io import StringIO
from pandas import read_csv
dtf = read_csv(StringIO("DATE_TIME,A\n2/8/2015 6:00:30,1"))
print(dtf)
dtf.set_index(dtf.DATE_TIME, drop=True, inplace=True)
print(dtf.columns)
print(dtf)
DATE_TIME A
0 2/8/2015 6:00:30 1
Index(['DATE_TIME', 'A'], dtype='object')
DATE_TIME A
DATE_TIME
2/8/2015 6:00:30 2/8/2015 6:00:30 1
DATE_TIME A
0 2/8/2015 6:00:30 1
Index(['A'], dtype='object')
A
DATE_TIME
2/8/2015 6:00:30 1
pd.show_versions()
INSTALLED VERSIONS
------------------
commit: None
python: 3.5.1.final.0
python-bits: 64
OS: Darwin
OS-release: 15.5.0
machine: x86_64
processor: i386
byteorder: little
LC_ALL: None
LANG: None
pandas: 0.18.1
nose: None
pip: 8.1.2
setuptools: 20.6.7
Cython: None
numpy: 1.11.1
scipy: 0.16.1
statsmodels: None
xarray: None
IPython: 4.0.1
sphinx: None
patsy: None
dateutil: 2.5.3
pytz: 2016.6
blosc: None
bottleneck: None
tables: None
numexpr: None
matplotlib: 1.5.0
openpyxl: 2.3.5
xlrd: 1.0.0
xlwt: 1.0.0
xlsxwriter: None
lxml: None
bs4: 4.4.1
html5lib: None
httplib2: 0.9.2
apiclient: 1.5.0
sqlalchemy: None
pymysql: None
psycopg2: None
jinja2: 2.8
boto: None
pandas_datareader: None
None
gracias, parece ser un error. si la entrada es un Series
cortado del original, la columna correspondiente debe descartarse.
funciona bien si pasamos el nombre de la columna.
dtf.set_index('DATE_TIME', drop=True, inplace=True)
dtf.columns
# Index(['A'], dtype='object')
no es un error - esto viola las garantías de set_index
no es válido pasar una columna real aquí -
no es lo mismo que asignar el índice
hay un PR en el que intentar hacer que esto funcione, pero es inherentemente ambiguo
ni siquiera estoy seguro de que puedas advertir sobre esto
(aunque ES un error usar en lugar y soltar, creo)
no es un error - esto viola las garantías de set_index
¿Podría explicar qué garantía es de set_index? Me resulta confuso si utilizo específicamente drop=True
y no obtengo ningún error cuando, por alguna razón, no se permite o no es posible eliminar.
@michaelaye
cuando pasa una lista para las claves, por definición se establece el índice. Sin embargo, se podría pensar que [58] es el resultado real de [57].
In [55]: df = pd.DataFrame({'A':range(2),'B':range(2),'C':range(2)})
In [56]: df
Out[56]:
A B C
0 0 0 0
1 1 1 1
In [57]: df.set_index(['A','B'])
Out[57]:
C
A B
0 0 0
1 1 1
In [58]: df.index=['A','B']
In [59]: df
Out[59]:
A B C
A 0 0 0
B 1 1 1
In [54]: DataFrame.set_index?
Signature: DataFrame.set_index(self, keys, drop=True, append=False, inplace=False, verify_integrity=False)
Docstring:
Set the DataFrame index (row labels) using one or more existing
columns. By default yields a new object.
Parameters
----------
keys : column label or list of column labels / arrays
drop : boolean, default True
Delete columns to be used as the new index
append : boolean, default False
Whether to append columns to existing index
inplace : boolean, default False
Modify the DataFrame in place (do not create a new object)
verify_integrity : boolean, default False
Check the new index for duplicates. Otherwise defer the check until
necessary. Setting to False will improve the performance of this
method
Examples
--------
>>> indexed_df = df.set_index(['A', 'B'])
>>> indexed_df2 = df.set_index(['A', [0, 1, 2, 0, 1, 2]])
>>> indexed_df3 = df.set_index([[0, 1, 2, 0, 1, 2]])
Returns
-------
dataframe : DataFrame
¿algún plan para arreglar esto?
Comentario más útil
gracias, parece ser un error. si la entrada es un
Series
cortado del original, la columna correspondiente debe descartarse.funciona bien si pasamos el nombre de la columna.