2017-01-26 19 views
9

shift chuyển đổi cột của tôi từ số nguyên sang phao. Nó chỉ ra rằng np.nan là chỉ nổi. Có cách nào để giữ cột chuyển đổi dưới dạng số nguyên không?gấu trúc chuyển đổi cột của tôi từ số nguyên sang phao.

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

bạn có thể sử dụng bản hack này: 'df ['b'] = df ['a']. Shift (1) .fillna (-1) .astype (df.a.dtype)' – MaxU

Trả lời

6

Vấn đề là bạn sẽ có được NaN giá trị là những gì float, vì vậy int được chuyển thành float - xem na type promotions.

Một giải pháp khả thi là chuyển đổi NaN giá trị cho một số giá trị như 0 và sau đó có thể chuyển đổi để 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

Một vấn đề khác là nếu sự thay đổi giới thiệu một NaN do đó chuyển đổi tất cả các số nguyên thành phao, có một số làm tròn xảy ra (ví dụ trên dấu thời gian epoch) vì vậy thậm chí recasting nó trở lại số nguyên không tái tạo những gì nó đã được ban đầu. Có cách nào để sửa lỗi này không? – guy

+0

Thật không may là không. – jezrael

3

Bạn có thể xây dựng một mảng numpy bởi prepending một 0 cho tất cả nhưng yếu tố cuối cùng của cột 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

một giải pháp khác là sử dụng hàm replace() và nhập loại

df['b'] = df['a'].shift(1).replace(np.NaN,0).astype(int) 
Các vấn đề liên quan