2017-11-16 2 views
1

In einem Pandas-Dataframe kann eine Spalte mit dtype = object tatsächlich Elemente gemischter Typen enthalten, z. B. Integer und Strings.Pandas: Wie identifiziert man Spalten mit einem dtype-Objekt, aber mit gemischten Typen?

In diesem Beispiel ist Spalte ein dtype Objekt, aber der erste Punkt ist Zeichenfolge während alle anderen int sind:

import numpy as np, pandas as pd 
df=pd.DataFrame() 
df['a']=np.arange(0,9) 
df.iloc[0,0]='test' 
print(df.dtypes) 
print(type(df.iloc[0,0])) 
print(type(df.iloc[1,0])) 

Meine Frage ist: ist es eine schnelle Möglichkeit, die mit dtype Spalten zu identifizieren = Objekt enthält in der Tat gemischte Typen wie oben? Da Pandas kein dtype = str haben, ist dies nicht sofort ersichtlich.

Ich habe jedoch Situationen gehabt, wo eine große CSV-Datei in Pandas importieren, ich eine Warnung wie bekommen würde:

sys:1: DtypeWarning: Columns (15,16) have mixed types. Specify dtype option on import or set low_memory=False 

Gibt es einen einfachen Weg, dies zu replizieren und explizit Liste die Spalten mit gemischtem Typen? Oder muss ich manuell nacheinander durchgehen, um zu sehen, ob ich sie in Strings usw. konvertieren kann?

Der Hintergrund ist, dass ich versuche, einen Datenrahmen zu einem Microsoft SQL Server mit DataFrame.to_sql und SQLAlchemy zu exportieren. Ich bekomme eine

OverflowError: int too big to convert 

aber mein Datenframe enthält keine Spalten mit dtype int - nur Objekt und float64. Ich vermute, das liegt daran, dass eine der Objektspalten sowohl Strings als auch Integer enthalten muss.

Danke!

+0

nur verwenden 'dtype' Parameter beim Aufruf von' df.to_sql (...) ' – MaxU

+0

, dass ein Wörterbuch Mapping vorbei Spaltennamen dtypes bedeuten würde, das heißt Abbilden alle Objektspalten zu bespannen. Zwei Zweifel: 1) Es scheint nicht sehr anders zu sein, als vor dem Export in Pandas selbst zu konvertieren. 2) Was könnte sonst noch eine Objektspalte enthalten (die ich nicht in eine Zeichenkette konvertieren möchte)? Ich nehme Daten an, richtig? –

+0

Ich verstehe nicht, was das Problem ist. Sie können keine gemischten Datentypen (für eine Spalte) in der SQL DB haben, daher werten Sie Ihre Werte entweder selbst aus oder es wird implizit für Sie erledigt ... – MaxU

Antwort

4

Setup-

df = pd.DataFrame(np.ones((3, 3)), columns=list('WXY')).assign(Z='c') 
df.iloc[0, 0] = 'a' 
df.iloc[1, 2] = 'b' 

df 

    W X Y Z 
0 a 1.0 1 c 
1 1 1.0 b c 
2 1 1.0 1 c 

Lösung
alle Arten finden und wie viele Einzigen pro Spalte zählen.

df.loc[:, df.applymap(type).nunique().gt(1)] 

    W Y 
0 a 1 
1 1 b 
2 1 1 
+0

Nur denkend, das unterscheidet nicht zwischen einer Spalte, die alle Zeichenfolgen und einige Nans enthält (die float sind), und eins, das z. B. Zeichenfolgen und ganze Zahlen enthält –

+0

Das ist richtig – piRSquared

+0

Ich frage mich, wie Menschen Pandas für Daten verwenden können Wissenschaft, wenn es so unglaublich schlecht ist mit fehlenden Werten umzugehen! –

Verwandte Themen