2016-02-28 34 views
5

Tôi muốn xóa tất cả các hàng (hoặc lấy tất cả các hàng không có) một biểu tượng dấu chấm hỏi trong bất kỳ cột nào. Tôi cũng muốn thay đổi các thành phần thành float loại.Thả các hàng có giá trị 'dấu chấm hỏi' trong bất kỳ cột nào trong khung dữ liệu gấu trúc

Input:

X Y Z 
0 1 ? 
1 2 3 
? ? 4 
4 4 4 
? 2 5 

Output:

X Y Z 
1 2 3 
4 4 4 

Tốt sử dụng hoạt động gấu trúc dataframe.

+1

'ra = df.replace ({ '?': Numpy.nan}). Dropna() .astype (float) ' –

+0

Nó giống như câu trả lời dưới đây nhưng rất đẹp với một lớp lót. Cảm ơn bạn – Anonymous

Trả lời

3

Bạn có thể thử tìm chuỗi đầu tiên ? trong cột, tạo mặt nạ boolean và các hàng lọc cuối cùng - sử dụng boolean indexing. Nếu bạn cần chuyển đổi cột để float, sử dụng astype:

print ~((df['X'] == '?') (df['Y'] == '?') | (df['Z'] == '?')) 
0 False 
1  True 
2 False 
3  True 
4 False 
dtype: bool 


df1 = df[~((df['X'] == '?') | (df['Y'] == '?') | (df['Z'] == '?'))].astype(float) 
print df1 
    X Y Z 
1 1 2 3 
3 4 4 4 

print df1.dtypes 
X float64 
Y float64 
Z float64 
dtype: object 

Hoặc bạn có thể thử:

df['X'] = pd.to_numeric(df['X'], errors='coerce') 
df['Y'] = pd.to_numeric(df['Y'], errors='coerce') 
df['Z'] = pd.to_numeric(df['Z'], errors='coerce') 
print df 
    X Y Z 
0 0 1 NaN 
1 1 2 3 
2 NaN NaN 4 
3 4 4 4 
4 NaN 2 5 
print ((df['X'].notnull()) & (df['Y'].notnull()) & (df['Z'].notnull())) 
0 False 
1  True 
2 False 
3  True 
4 False 
dtype: bool 

print df[ ((df['X'].notnull()) & (df['Y'].notnull()) & (df['Z'].notnull())) ].astype(float) 
    X Y Z 
1 1 2 3 
3 4 4 4 
+0

Tôi nhận được một TypeError: so sánh loại không hợp lệ – Anonymous

+0

Loại giá trị với '?' Là gì? Hãy thử kiểm tra nó 'print type (df.at [0, 'Z'])' - có '? ' – jezrael

+0

Nó hoạt động cho một cột. Vì vậy, nó loại bỏ các hàng tốt cho một người lập chỉ mục boolean. Nhưng ngay sau khi tôi sử dụng | (hoặc) nó không thành công – Anonymous

Các vấn đề liên quan