Pandas: Set_index funktioniert nicht mit drop

Erstellt am 14. Juli 2016  ·  6Kommentare  ·  Quelle: pandas-dev/pandas

Codebeispiel, wenn möglich ein kopierfähiges Beispiel

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)

Aktueller Output

           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

Erwartete Ausgabe

           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

Ausgabe von 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
Bug Error Reporting Reshaping

Hilfreichster Kommentar

Danke, es scheint ein Fehler zu sein. Wenn die Eingabe ein Series vom Original abgeschnitten wurde, sollte die entsprechende Spalte gelöscht werden.

funktioniert gut, wenn wir den Spaltennamen übergeben.

dtf.set_index('DATE_TIME', drop=True, inplace=True)
dtf.columns
# Index(['A'], dtype='object')

Alle 6 Kommentare

Danke, es scheint ein Fehler zu sein. Wenn die Eingabe ein Series vom Original abgeschnitten wurde, sollte die entsprechende Spalte gelöscht werden.

funktioniert gut, wenn wir den Spaltennamen übergeben.

dtf.set_index('DATE_TIME', drop=True, inplace=True)
dtf.columns
# Index(['A'], dtype='object')

kein Fehler - dies verstößt gegen die Garantien von set_index

Es ist nicht gültig, hier eine tatsächliche Spalte zu übergeben -

Es ist nicht dasselbe wie das tatsächliche Zuweisen des Index

Es gibt eine PR, in der versucht wird, diese Arbeit zu machen - aber sie ist von Natur aus mehrdeutig

Ich bin mir nicht mal sicher, ob du davor warnen könntest
(obwohl es ein Fehler ist, inplace und drop zu verwenden, denke ich)

kein Fehler - dies verstößt gegen die Garantien von set_index

Könnten Sie näher erläutern, welche Garantie set_index ist? Ich finde es verwirrend, wenn ich speziell drop=True und keine Fehlermeldung erhalte, wenn das Löschen aus irgendeinem Grund nicht erlaubt oder möglich ist.

@ Michaelaye

Wenn Sie eine Liste für die Schlüssel übergeben, wird per Definition der Index festgelegt. Man könnte jedoch möglicherweise denken, dass [58] das tatsächliche Ergebnis von [57] ist.

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

Pläne, dies zu beheben?

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen