2016-12-14 18 views
5

Tôi có dữ liệu chuỗi thời gian theo định dạng sau, trong đó giá trị biểu thị số tiền tích lũy kể từ lần ghi trước đây. Những gì tôi muốn làm là "lan truyền" rằng số lượng tích lũy trong giai đoạn vừa qua có chứa NaN để đầu vào này:Pandas cách thành ngữ để tùy chỉnh fillna

s = pd.Series([0, 0, np.nan, np.nan, 75, np.nan, np.nan, np.nan, np.nan, 50], 
       pd.date_range(start="Jan 1 2016", end="Jan 10 2016", freq='D')) 

2016-01-01  0.0 
2016-01-02  0.0 
2016-01-03  NaN 
2016-01-04  NaN 
2016-01-05  75.0 
2016-01-06  NaN 
2016-01-07  NaN 
2016-01-08  NaN 
2016-01-09  NaN 
2016-01-10  50.0 

trở thành đầu ra này:

2016-01-01  0.0 
2016-01-02  0.0 
2016-01-03 25.0 
2016-01-04 25.0 
2016-01-05 25.0 
2016-01-06 10.0 
2016-01-07 10.0 
2016-01-08 10.0 
2016-01-09 10.0 
2016-01-10 10.0 

Có một Pandas cách thành ngữ để làm điều này thay vì chỉ làm vòng lặp cho dữ liệu? Tôi đã thử nhiều thứ liên quan đến fillna, dropna, isnull, đang thực hiện shift để kiểm tra giá trị tiếp theo, v.v. nhưng tôi không thể xem cách ghép các phần lại với nhau.

+0

Câu hỏi thú vị. Tôi không nghĩ rằng có một cách tích hợp, và, thật không may, bạn có thể phải kết thúc vòng lặp. –

Trả lời

5

này có thể làm việc, đối với mỗi đoạn của các giá trị mất tích, tạo một biến nhóm với cumsum (từ ngày kết thúc của bộ truyện) và sau đó thực hiện một hoạt động trung bình nhóm trên mỗi đoạn:

s.groupby(s.notnull()[::-1].cumsum()[::-1]).transform(lambda g: g[-1]/g.size) 

#2016-01-01  0.0 
#2016-01-02  0.0 
#2016-01-03 25.0 
#2016-01-04 25.0 
#2016-01-05 25.0 
#2016-01-06 10.0 
#2016-01-07 10.0 
#2016-01-08 10.0 
#2016-01-09 10.0 
#2016-01-10 10.0 
#Freq: D, dtype: float64 

Hoặc một tùy chọn khác:

s.groupby(s.shift().notnull().cumsum()).transform(lambda g: g[-1]/g.size) 

#2016-01-01  0.0 
#2016-01-02  0.0 
#2016-01-03 25.0 
#2016-01-04 25.0 
#2016-01-05 25.0 
#2016-01-06 10.0 
#2016-01-07 10.0 
#2016-01-08 10.0 
#2016-01-09 10.0 
#2016-01-10 10.0 
#Freq: D, dtype: float64 
Các vấn đề liên quan