2016-09-06 5 views
0

Hier erwartet die Durchführung ist meine Funktion:Python Pandas df.ix nicht als

def clean_zipcodes(df): 
    df.ix[df['workCountryCode'].str.contains('USA') & \ 
    df['workZipcode'].astype(str).str.len() > 5, 'workZipcode'] = \ 
    df['workZipcode'].astype(int).floordiv(10000) 


df.ix[df['contractCountryCode'].str.contains('USA') & \ 
    df['contractZipcode'].astype(str).str.len() > 5, 'contractZipcode'] = \ 
    df['contractZipcode'].astype(int).floordiv(10000) 

return df 

Hier ist meine Testfunktion von dem, was ich erwarten:

def test_clean_zipcodes(): 
testDf = pandas.DataFrame({'unique_transaction_id' : ['1', '1', '1'], 
          'workZipcode'   : [838431000, 991631000, 99163], 
          'contractZipcode'  : [838431000, 991631000, 99163], 
          'workCountryCode'  : ['USA: STUFF', 'NONE: STUFF', 'USA: STUFF'], 
          'contractCountryCode' : ['USA: STUFF', 'NONE: STUFF', 'USA: STUFF']}) 

resultDf = pandas.DataFrame({'unique_transaction_id' : ['1', '1', '1'], 
           'workZipcode'    : [83843, 991631000, 99163], 
           'contractZipcode'   : [83843, 991631000, 99163], 
           'workCountryCode'   : ['USA: STUFF', 'NONE: STUFF', 'USA: STUFF'], 
           'contractCountryCode'  : ['USA: STUFF', 'NONE: STUFF', 'USA: STUFF']}) 

assert resultDf.equals(clean_zipcodes(testDf)) 

Abgesehen von Vertiefungen wesenseigen nicht (didn‘ t konvertieren für SO-Formatierung), führt der df.ix nicht wie erwartet aus. In den Spalten contractZipcode und workZipcode werden keine Transformationen durchgeführt. Die erste Zeile sollte in 83843 geändert werden, wie in resultDf angegeben.

Vielen Dank im Voraus!

Antwort

1
In [2]: import pandas as pd 


In [3]: testDf = pd.DataFrame({'unique_transaction_id' : ['1', '1', '1'], 
    ...:       'workZipcode'   : [838431000, 991631000, 99163], 
    ...:       'contractZipcode'  : [838431000, 991631000, 99163], 
    ...:       'workCountryCode'  : ['USA: STUFF', 'NONE: STUFF', 'USA: STUFF'], 
    ...:       'contractCountryCode' : ['USA: STUFF', 'NONE: STUFF', 'USA: STUFF']} 
    ...:      ) 
    ...: 
    ...: resultDf = pd.DataFrame({'unique_transaction_id' : ['1', '1', '1'], 
    ...:        'workZipcode'    : [83843, 991631000, 99163], 
    ...:        'contractZipcode'   : [83843, 991631000, 99163], 
    ...:        'workCountryCode'   : ['USA: STUFF', 'NONE: STUFF', 'USA: STUFF'], 
    ...:        'contractCountryCode'  : ['USA: STUFF', 'NONE: STUFF', 'USA: STUFF']}) 
    ...: 
    ...: 
    ...: 

Beachten Sie, dass eine leere Scheibe zurückgegeben wird, wenn Sie indizieren wie diese versuchen:

In [4]: testDf.ix[testDf['workCountryCode'].str.contains('USA') & 
        testDf['workZipcode'].astype(str).str.len() > 5, 
        'workZipcode'] 
Out[4]: Series([], Name: workZipcode, dtype: int64) 

Wenn Sie Klammern um Ihre verschiedenen Filter hinzufügen:

In [5]: testDf.ix[(testDf['workCountryCode'].str.contains('USA')) 
        & (testDf['workZipcode'].astype(str).str.len() > 5), 
        'workZipcode'] 
Out[5]: 
0 838431000 
Name: workZipcode, dtype: int64 

Sie, was zurückbekommen Sie wollen. Es spielt keine Rolle, ob Sie loc verwenden entweder:

In [6]: testDf.loc[testDf['workCountryCode'].str.contains('USA') & 
        testDf['workZipcode'].astype(str).str.len() > 5, 
        'workZipcode'] 
Out[6]: Series([], Name: workZipcode, dtype: int64) 

Also hier ist die aufgeräumte Funktion: ich ein paar kleine lambdas zur besseren Lesbarkeit halber hinzugefügt.

In [7]: def clean_zipcodes_loc(df): 
    ...:  strlen = lambda x: x.astype(str).str.len() 
    ...:  floordiv = lambda x: x.astype(int).floordiv(10000) 
    ...: 
    ...:  df.loc[((strlen(df.workZipcode)) > 5) & 
    ...:   df.workCountryCode.str.contains("USA"), 
    ...:   'workZipcode'] = floordiv(df.workZipcode) 
    ...: 
    ...:  df.loc[((strlen(df.contractZipcode)) > 5) & 
    ...:   df.contractCountryCode.str.contains("USA"), 
    ...:   'contractZipcode'] = floordiv(df.contractZipcode) 
    ...: 
    ...:  return df 
    ...: 

In [8]: clean_zipcodes_loc(testDf) == resultDf 
Out[8]: 
    contractCountryCode contractZipcode unique_transaction_id workCountryCode \ 
0    True   True     True   True 
1    True   True     True   True 
2    True   True     True   True 

    workZipcode 
0  True 
1  True 
2  True 
Verwandte Themen