2016-11-11 3 views
2

betrachten die pd.DataFramedfDowncasting Serie oder Datenrahmen Element für Element

df = pd.DataFrame([ 
     [1.0, 1.5], 
     [2.2, 3.0] 
    ]) 

ich die einzelnen Elemente in int zu niedergeschlagenen wollen, wenn sie gleich sind. Ich verstehe, dass jede Spalte als Objekttyp endet. Das ist ok.

enter image description here

<class 'pandas.core.frame.DataFrame'> 
RangeIndex: 2 entries, 0 to 1 
Data columns (total 2 columns): 
0 2 non-null object 
1 2 non-null object 
dtypes: object(2) 
memory usage: 112.0+ bytes 
+0

dies ist nicht idiomatischer und nicht performant, also kein Grund, diese – Jeff

+0

zu tun @ Jeff Ich habe nicht für performante fragen. Dies ist ein einfacher Komfort für das Reporting. Ich wollte später in Strings konvertieren und in andere Dinge einfügen. Ich stellte fest, dass dies das minimale Beispiel war. – piRSquared

Antwort

2

Sie müssen die dtype-object zuerst konvertieren, dann können Sie eine Maske verwenden, um die Werte von Interesse unter Verwendung astype(int) auf dem df überschrieben werden vorausgesetzt, alle Spalten sind numerisch:

In [120]: 
df = df.astype(object) 
df[df == df.astype(int)] = df.astype(int) 
df 

Out[120]: 
    0 1 
0 1 1.5 
1 2.2 3 

Ohne die Besetzung bleibt die Zuweisung als float

Sie können sehen, dass die einzelne Typen werden geändert:

In [123]: 
df.applymap(type) 

Out[123]: 
       0    1 
0 <class 'int'> <class 'float'> 
1 <class 'float'> <class 'int'> 
+0

wenn ich 'type (df.at [0,0]) überprüfe' gibt es mir 'float' - weisst du warum? Ist es '.at []' - Wer macht zusätzliches Casting? – MaxU

+1

@MaxU Entschuldigung, ich bekomme 'int' Sie ordnen das Ergebnis zurück? – EdChum

+1

ja, ich bin. 'df.dtypes' gibt' object' für beide Spalten zurück – MaxU

Verwandte Themen