2017-11-29 3 views
1

Ich versuche, die folgende Schleife zu konvertieren Verständnis der Liste hinzu:Pandas Liste Verständnis über Spalten anstelle von Zeilen

# convert integer-only valued columns from type float to type int 
for col in df: 
    if sum(df[col]%1) == 0: 
     df[col]=df[col].astype(int) 

Ich kann nicht scheinen, um die Syntax zu bekommen für diese richtig zu arbeiten. Dies ist, was ich bisher versucht habe:

new_df = pd.DataFrame([df[col].astype(int) if sum(df[col]%1)==0 else df[col] for col in df]) 

Dies scheint meinen Datenrahmen zu transponieren und nicht tatsächlich die Typen zu konvertieren. Würde mir bitte jemand helfen? Auch wenn es einen idiomatischen Weg gibt, um nur int-bewertete Spalten vom Float- in den Int-Typ zu konvertieren, bin ich offen für einen anderen Ansatz.

Antwort

2

Sie concat verwenden können:

df = pd.concat([df[col].astype(int) if sum(df[col]%1)==0 else df[col] for col in df], 1) 

Oder:

df = df.astype(df.dtypes.mask((df%1==0).all(), 'int')) 
+1

Oh, die eine Maske ist interessant auch danke :) – Austin

+1

Froh kann dir helfen! – jezrael

+1

Ich konnte nicht daran denken, eine Serie an astype zu übergeben. Werde das nicht vergessen. – Dark

2

Warum können wir nicht verwenden np.where und ein dict zur Karte dtypes dh

df = pd.DataFrame({'co1':[1.,2.,3.,4.],'co2':[2.5,6.5,7.5,1.3]}) 

df = df.astype(dict(zip(df.columns,np.where((df%1==0).all(),np.int,df.dtypes)))) 

    co1 co2 
0 1 2.5 
1 2 6.5 
2 3 7.5 
3 4 1.3 
Verwandte Themen