2017-01-26 26 views
9

Konwertuje moją kolumnę z liczby całkowitej na wartość zmiennoprzecinkową. Okazuje się, że np.nan jest tylko zmiennoprzecinkowe. Czy są jakieś sposoby na utrzymanie przesuniętej kolumny jako liczby całkowitej?przesunięcie pandy konwertuje moją kolumnę z liczby całkowitej do wartości zmiennoprzecinkowej.

df = pd.DataFrame({"a":range(5)}) 
df['b'] = df['a'].shift(1) 

df['a'] 
# 0 0 
# 1 1 
# 2 2 
# 3 3 
# 4 4 
# Name: a, dtype: int64 

df['b'] 

# 0 NaN 
# 1  0 
# 2  1 
# 3  2 
# 4  3 
# Name: b, dtype: float64 
+1

możesz użyć tego hacka: 'df ['b'] = df ['a']. Shift (1) .fillna (-1) .astype (df.a.dtype)' – MaxU

Odpowiedz

6

Problem jest dostać NaN wartości, co jest float, więc int przekształca się float - patrz na type promotions.

Możliwym rozwiązaniem jest konwersja NaN wartości do pewnej wartości, jak 0, a następnie możliwe jest przeliczyć int:

df = pd.DataFrame({"a":range(5)}) 
df['b'] = df['a'].shift(1).fillna(0).astype(int) 
print (df) 
    a b 
0 0 0 
1 1 0 
2 2 1 
3 3 2 
4 4 3 
+0

Kolejna kwestia to jeśli zmiana wprowadza NaN, konwertując w ten sposób wszystkie liczby całkowite na zmienne, następuje pewne zaokrąglenie (np na sygnaturach czasowych epoki), więc nawet przekształcenie go z powrotem w liczbę całkowitą nie powiela tego, co pierwotnie było. Jakikolwiek sposób to naprawić? – guy

+0

Niestety nie. – jezrael

3

można skonstruować numpy tablicę, dołączając do 0 na wszystkie oprócz ostatniego elementu kolumny a

df.assign(b=np.append(0, df.a.values[:-1])) 

    a b 
0 0 0 
1 1 0 
2 2 1 
3 3 2 
4 4 3 
0

innym rozwiązaniem jest użycie wymienić() i typu odlew

df['b'] = df['a'].shift(1).replace(np.NaN,0).astype(int)