2015-05-20 25 views
22

Tôi muốn điền vào giá trị bị thiếu trong một cột với giá trị của một cột khác.Pandas - FillNa với một cột khác

Tôi đọc rằng lặp qua mỗi hàng sẽ là thực hành rất xấu và rằng nó sẽ là tốt hơn để làm tất cả mọi thứ trong một đi nhưng tôi không thể tìm hiểu làm thế nào để làm điều đó với phương pháp fillna.

dữ liệu Trước

Day Cat1 Cat2 
1 cat mouse 
2 dog elephant 
3 cat giraf 
4 NaN ant 

dữ liệu Sau khi

Day Cat1 Cat2 
1 cat mouse 
2 dog elephant 
3 cat giraf 
4 ant ant 

Trả lời

45

Bạn có thể cung cấp cột này để fillna (xem docs), nó sẽ sử dụng những giá trị trên phù hợp với các chỉ số để điền vào:

In [17]: df['Cat1'].fillna(df['Cat2']) 
Out[17]: 
0 cat 
1 dog 
2 cat 
3 ant 
Name: Cat1, dtype: object 
+0

Rất tuyệt! Tôi không biết rằng '' fillna'' có một chuỗi. –

+0

Cảm ơn! Tôi nghĩ serie phải là kích thước chính xác của số lượng giá trị NA. – xav

4

Bạn có thể làm

df.Cat1 = np.where(df.Cat1.isnull(), df.Cat2, df.Cat1) 

Các cấu trúc tổng thể trên RHS sử dụng the ternary pattern from the pandas cookbook (mà nó trả tiền để đọc trong mọi trường hợp) . Đó là phiên bản vectơ của a? b: c.

+0

Không các giải pháp tôi sử dụng cho vấn đề này nhưng mô hình rất thú vị! Cảm ơn! – xav

4

Chỉ cần sử dụng value tham số thay vì method:

In [20]: df 
Out[20]: 
    Cat1  Cat2 Day 
0 cat  mouse 1 
1 dog elephant 2 
2 cat  giraf 3 
3 NaN  ant 4 

In [21]: df.Cat1 = df.Cat1.fillna(value=df.Cat2) 

In [22]: df 
Out[22]: 
    Cat1  Cat2 Day 
0 cat  mouse 1 
1 dog elephant 2 
2 cat  giraf 3 
3 ant  ant 4 
+0

Cảm ơn bạn đã trả lời! Nó thay đổi gì để sử dụng giá trị hơn là phương pháp được mô tả bởi joris? – xav

+0

@xav 'value' là tham số đầu tiên, vì vậy joris thực sự đang làm điều tương tự. Như ông đã nói, hãy xem [tài liệu] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.fillna.html). – chrisaycock

+0

Có, docstring hơi gây hiểu lầm khi 'phương thức' được liệt kê ở đó trước tiên. – joris

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