2017-01-29 11 views
3
  1. las ich eine Excel-Datei mit pd.read_excel()
  2. Eine der Spalten zu multiplizieren ist ‚Energieversorgung‘ enthält, Strings und Zahlen genannt
  3. ich den folgenden Code verwenden:

for x in energy['Energy Supply']: print(type(x))Wie nur die numerischen Werte in einer Spalte

und die Probe der Ergebnisse:

<class 'str'> 
<class 'int'> 
<class 'float'> 

Ich muss auf die numerischen Werte in dieser Spalte mit einer Million multiplizieren.

Ich habe versucht, den folgenden Code, aber es hat zu sagen nicht:

unorderable types: str() > int()

for x in energy['Energy Supply']: 
    if type(x) != 'str': 
     while x>0: 
      x = x*1000000 

Ich habe versucht:

energy['Energy Supply'].select_dtypes(include=['int64']) * 1000000 

aber es wird gesagt:

AttributeError: 'Series' object has no attribute 'select_dtypes'

Ich habe versucht, :

energy['Energy Supply'] = [x * 1000000 for (type(x)=='int' 
              & x in energy['Energy Supply'])] 

aber bekam den Syntaxfehler.

Weder arbeitete die folgende Zeile:

energy.multiply(1000000, axis='Energy Supply', level=None, fill_value=None) 

Die folgende Zeile Fehler mir nicht geben, aber es tut nichts:

energy[energy.select_dtypes(include=['number']).columns] *= 1000000 

ich wirklich zu schätzen, wenn jemand Sie bitte helfen könnte ich, wie man das macht.

+0

'wenn Typ (x) =‚str! "muss sein" wenn type (x)! = str' ... – DyZ

+0

haha ​​coursera;) –

Antwort

2

können Sie mask mit Maske von to_numeric und notnull erstellt verwenden:

energy = pd.DataFrame({'Energy Supply':[10, 1.0,'a']}) 
print(energy) 
    Energy Supply 
0   10 
1    1 
2    a 

mask = pd.to_numeric(energy['Energy Supply'], errors='coerce').notnull() 
print (mask) 
0  True 
1  True 
2 False 
Name: Energy Supply, dtype: bool 

Eine andere Lösung ist types überprüfen:

mask = energy['Energy Supply'].apply(lambda x: type(x) in [int, float]) 
print (mask) 
0  True 
1  True 
2 False 
Name: Energy Supply, dtype: bool 

energy['Energy Supply'] = energy['Energy Supply'].mask(mask, 
                 energy['Energy Supply'] * 1000000) 
print (energy) 
    Energy Supply 
0  10000000 
1   1e+06 
2    a 

Statt mask besteht die Möglichkeit, loc für ausgewählte nur numerische Werte:

print (energy.loc[mask, 'Energy Supply']) 
0 10 
1  1 
Name: Energy Supply, dtype: object 

energy.loc[mask, 'Energy Supply'] = energy.loc[mask, 'Energy Supply'] * 1000000 
print (energy) 
    Energy Supply 
0  10000000 
1   1e+06 
2    a 
1

Eine andere Lösung:

def multiply_if_number(x): # This could be a `lambda` 
    return x * 1e6 if type(x) in [int,float] else x 

energy['Energy Supply'] = energy['Energy Supply'].apply(multiply_if_number) 
2
  • pd.to_numeric mit Parameter errors='coerce'
  • dropna + update

Mit Datenrahmen des @ jezrael

energy = pd.DataFrame({'Energy Supply':[10, 1.0,'a']}) 

energy.update(pd.to_numeric(energy['Energy Supply'], 'coerce').mul(1e6).dropna()) 
energy 

    Energy Supply 
0   1e+07 
1   1e+06 
2    a 
Verwandte Themen