Lấy DataFrame đồ chơi sau:Bắt quan sát gần đây nhất & ngày từ nhiều cột
data = np.arange(35, dtype=np.float32).reshape(7, 5)
data = pd.concat((
pd.DataFrame(list('abcdefg'), columns=['field1']),
pd.DataFrame(data, columns=['field2', '2014', '2015', '2016', '2017'])),
axis=1)
data.iloc[1:4, 4:] = np.nan
data.iloc[4, 3:] = np.nan
print(data)
field1 field2 2014 2015 2016 2017
0 a 0.0 1.0 2.0 3.0 4.0
1 b 5.0 6.0 7.0 NaN NaN
2 c 10.0 11.0 12.0 NaN NaN
3 d 15.0 16.0 17.0 NaN NaN
4 e 20.0 21.0 NaN NaN NaN
5 f 25.0 26.0 27.0 28.0 29.0
6 g 30.0 31.0 32.0 33.0 34.0
Tôi muốn thay thế "năm" cột (2014-2017) với hai lĩnh vực: phi gần đây nhất - quan sát đầy đủ và năm tương ứng của quan sát đó. Giả sử field1
là khóa duy nhất. (Tôi không muốn làm bất cứ ops groupby, chỉ cần 1 hàng cho mỗi bản ghi.) Tức là:
field1 field2 obs date
0 a 0.0 4.0 2017
1 b 5.0 7.0 2015
2 c 10.0 12.0 2015
3 d 15.0 17.0 2015
4 e 20.0 21.0 2014
5 f 25.0 29.0 2017
6 g 30.0 34.0 2017
tôi đã nhận được này cho đến nay:
pd.melt(data, id_vars=['field1', 'field2'],
value_vars=['2014', '2015', '2016', '2017'])\
.dropna(subset=['value'])
field1 field2 variable value
0 a 0.0 2014 1.0
1 b 5.0 2014 6.0
2 c 10.0 2014 11.0
3 d 15.0 2014 16.0
4 e 20.0 2014 21.0
5 f 25.0 2014 26.0
6 g 30.0 2014 31.0
# ...
Nhưng đang phải vật lộn với làm thế nào để xoay trở lại theo định dạng mong muốn.
Tôi không chắc chắn về điều này - IIUC, OP muốn giá trị hợp lệ gần đây nhất, không phải là giá trị tối đa. Trong tập dữ liệu đã cho, chúng giống nhau, nhưng nếu (ví dụ) a cho năm 2017 là -10, tôi nghĩ đó là những gì chúng ta nên quay lại. – DSM
@DSM, cảm ơn bạn đã làm rõ! Tôi nghĩ rằng nếu tôi sẽ thay thế 'max()' với 'last()' nó sẽ làm thủ thuật ... – MaxU
Nhưng bây giờ bạn đang sử dụng _obs_ cuối cùng nhưng _date_ tối đa (vì vậy 2016, không phải năm 2017). [Để làm rõ, tôi có nghĩa là "ngày mà tối đa đạt được", tôi chỉ lười biếng đến mức sai.] Bạn cần tương đương với 'idxlast()' (không tồn tại, nhưng YKWIM.) – DSM