2017-02-11 7 views
4

Im Datenrahmen unter:Ersetzen Wert in jeder Spalte in Pandas Datenrahmen

T2MN T2MX RH2M DFP2M RAIN 
6.96 9.32 84.27 5.57 - 
6.31 10.46 -  5.63 - 
    - 10.66 79.38 3.63 - 
0.79 4.45 94.24 1.85 - 
1.45 3.99 91.71 1.17 - 

Wie ersetze ich alle - mit Nans. Ich will nicht, Spaltennamen angeben, da ich weiß nicht, bevor die Hand, welcher Spalte -

+0

Das ist für nan wie der Anzeigewert sieht –

Antwort

5

Wenn diese Strings sind, dann Schwimmer sind wahrscheinlich auch Saiten.

Ihre Datenrahmen Unter der Annahme df, würde ich

pd.to_numeric(df.stack(), 'coerce').unstack() 

Deeper Erklärung

versuchen Pandas in der Regel nicht fehlen Schwimmer mit '-' darstellen. Daher muss '-' eine Zeichenfolge sein. So muss die dtype einer beliebigen Spalte mit einer '-' darin 'object' sein. Das macht es sehr wahrscheinlich, dass, was auch immer die Daten analysierte, die Floats als String belassen wurden.

Setup

from io import StringIO 
import pandas as pd 

txt = """T2MN T2MX RH2M DFP2M RAIN 
6.96 9.32 84.27 5.57 - 
6.31 10.46 -  5.63 - 
    - 10.66 79.38 3.63 - 
0.79 4.45 94.24 1.85 - 
1.45 3.99 91.71 1.17 - """ 

df = pd.read_csv(StringIO(txt), delim_whitespace=True) 
print(df) 

    T2MN T2MX RH2M DFP2M RAIN 
0 6.96 9.32 84.27 5.57 - 
1 6.31 10.46  - 5.63 - 
2  - 10.66 79.38 3.63 - 
3 0.79 4.45 94.24 1.85 - 
4 1.45 3.99 91.71 1.17 - 

Was sind die dtypes?

print(df.dtypes) 

T2MN  object 
T2MX  float64 
RH2M  object 
DFP2M float64 
RAIN  object 
dtype: object 

Was ist der Typ des ersten Elements? Diese

print(type(df.iloc[0, 0])) 

<class 'str'> 

bedeutet, dass jede Spalte mit einer '-' wie eine Säule von Strings ist, die wie Schwimmer aussehen. Sie möchten pd.to_numeric mit dem Parameter errors='coerce' verwenden, um nicht numerische Elemente auf np.nan zu erzwingen. pd.to_numeric funktioniert jedoch nicht auf pd.DataFrame, also wir stack und unstack.

pd.to_numeric(df.stack(), 'coerce').unstack() 

    T2MN T2MX RH2M DFP2M RAIN 
0 6.96 9.32 84.27 5.57 NaN 
1 6.31 10.46 NaN 5.63 NaN 
2 NaN 10.66 79.38 3.63 NaN 
3 0.79 4.45 94.24 1.85 NaN 
4 1.45 3.99 91.71 1.17 NaN 
5

Gerade replace() die Zeichenfolge haben:

In [10]: df.replace('-', 'NaN') 
Out[10]: 
    T2MN T2MX RH2M DFP2M RAIN 
0 6.96 9.32 84.27 5.57 NaN 
1 6.31 10.46 NaN 5.63 NaN 
2 NaN 10.66 79.38 3.63 NaN 
3 0.79 4.45 94.24 1.85 NaN 
4 1.45 3.99 91.71 1.17 NaN 
2

Ich glaube, Sie die tatsächliche numpy.nan wollen anstelle einer Zeichenfolge NaN wie Sie eine Menge von Methoden wie fillna/isnull/notnull auf dem pandas.Series/pandas.DataFrame

import pandas as pd 

import numpy as np 

df = pd.DataFrame([['-']*10]*10) 

df = df.replace('-',np.nan) 
1

können es aussieht wie du lasen diese Daten aus CSV/FWF-Datei ... Wenn es wahr ist, der einfachste Weg, um '-' loszuwerden wäre Pandas zu erklären, dass es NaN 's Darstellung ist:

df = pd.read_csv(filename, na_values=['NaN', 'nan', '-']) 

Test:

In [79]: df 
Out[79]: 
    T2MN T2MX RH2M DFP2M RAIN 
0 6.96 9.32 84.27 5.57 NaN 
1 6.31 10.46 NaN 5.63 NaN 
2 NaN 10.66 79.38 3.63 NaN 
3 0.79 4.45 94.24 1.85 NaN 
4 1.45 3.99 91.71 1.17 NaN 

In [80]: df.dtypes 
Out[80]: 
T2MN  float64 
T2MX  float64 
RH2M  float64 
DFP2M float64 
RAIN  float64 
dtype: object 
Verwandte Themen