2016-04-20 2 views
7

Quando unisci due dataframes con un indice che si fonde su alcuni valori ma non su tutti utilizzando l'unione 'esterna', python/pandas aggiunge automaticamente valori Null (NaN) ai campi che non è possibile abbinare su Bene, questo è un comportamento normale, ma cambia il tipo di dati. Questo è un problema perché ora devi ridefinire quali tipi di dati dovrebbero avere le colonne.Mantieni il tipo di dati della colonna Dataframe dopo l'unione esterna

fillna o dropna() non sembrano conservare i tipi di dati immediatamente dopo l'unione. O ho bisogno di una struttura di tabella in atto?

tipicamente eseguirò numpy np.where (field.isnull() ecc) ma ciò significa che è in esecuzione per tutte le colonne.

Qual è la soluzione?

+0

Penso che qualche esempio possa aiutare a chiarire cosa vuoi ottenere. A volte non è possibile modificare un tipo, ad esempio da float a int, perché una colonna int non può contenere NaN. E se tutti i NaN vengono immediatamente eliminati, perché usare "esterno"? – ptrj

risposta

2

Non penso che ci sia un modo veramente elegante/efficiente per farlo. Puoi farlo rintracciando i tipi di dati originali e quindi lanciando le colonne dopo l'unione, in questo modo:

import pandas as pd 

# all types are originally ints 
df = pd.DataFrame({'a': [1]*10, 'b': [1, 2] * 5, 'c': range(10)}) 
df2 = pd.DataFrame({'e': [1, 1], 'd': [1, 2]}) 

# track the original dtypes 
orig = df.dtypes.to_dict() 
orig.update(df2.dtypes.to_dict()) 

# join the dataframe 
joined = df.join(df2, how='outer') 

# columns with nans are now float dtype 
print joined.dtypes 

# replace nans with suitable int value 
joined.fillna(-1, inplace=True) 

# re-cast the columns as their original dtype 
joined_orig_types = joined.apply(lambda x: x.astype(orig[x.name])) 

print joined_orig_types.dtypes