2016-04-20 10 views
7

Po scaleniu dwóch ramek danych z indeksem, który łączy pewne wartości, ale nie we wszystkich przy użyciu "zewnętrznego" scalania, python/pandy automatycznie dodaje wartości Null (NaN) do pól, których nie może mecz na. To jest normalne zachowanie, ale zmienia typ danych. Jest to problem, ponieważ musisz teraz ponownie określić, jakie typy danych powinny mieć kolumny.Zachowaj typ danych kolumny Dataframe po zewnętrznym scaleniu

fillna lub dropna() nie zachowują typów danych natychmiast po scaleniu. Czy potrzebuję struktury tabeli w miejscu?

Zazwyczaj uruchamiałbym numpy np.where (field.isnull() itp.), Ale oznacza to uruchomienie dla wszystkich kolumn.

Co obejście tego?

+0

Myślę, że przykład może pomóc w wyjaśnieniu, co chcesz osiągnąć. Czasem nie można zmienić typu, np. Z float na int, ponieważ kolumna int nie może zawierać NaN. A jeśli wszystkie NaN są natychmiast odrzucane, to po co używać "zewnętrznego"? – ptrj

Odpowiedz

2

Nie sądzę, że istnieje naprawdę elegancki/skuteczny sposób na zrobienie tego. Możesz to zrobić, śledząc oryginalne typy danych, a następnie rzucając kolumny po scaleniu, tak:

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 
Powiązane problemy