我坚持如何获取唯一标识符的DataFrame的最新非NaN值。所以我有一个Pandas DataFrame,其中包含一列ID,值和年份,类似于:
| ID | Values | Year
-------------------------
0 | A | 4.0 | 2016
1 | B | NaN | 2016
2 | C | NaN | 2016
3 | D | 1.0 | 2016
4 | A | 2.0 | 2015
5 | B | 2.0 | 2015
6 | C | 1.0 | 2015
7 | D | 3.0 | 2015
8 | A | 2.0 | 2014
9 | B | 2.0 | 2014
10| C | 3.0 | 2014
11| D | NaN | 2014
我正在试图弄清楚如何获取每个ID的最新(最新)非NaN值列表。因此,此案例的列表应为:
[4.0, 2.0, 1.0, 1.0]
分别是A,B,C和D的最新值(跳过任何NaN)。 到目前为止,我通过做这样的支点来解决这个问题:
df.pivot(index = 'Year', columns = 'ID', values = 'Values')
所以我得到了:
ID | A | B | C | D
----------------------
Year | | | |
2014 |2.0|2.0|3.0|NaN
2015 |2.0|2.0|1.0|3.0
2016 |4.0|NaN|Nan|1.0
在这里,我被困住了 - 为每个ID获取最新的非NaN值的最佳方法是什么?任何使用原始DataFrame或旋转数据框架的建议都将受到赞赏!
答案 0 :(得分:3)
你太近了。使用ffill()
:
df.pivot(index='Year',columns='ID',values='Values').ffill().values[-1]
结果:
array([ 4., 2., 1., 1.])
答案 1 :(得分:3)
另一个groupby
选项:
如果数据已经按'Year'
降序排序,就像示例数据中那样:
df.groupby('ID')['Values'].first()
如果数据尚未排序:
df.sort_values(by='Year').groupby('ID')['Values'].last()
结果输出:
ID
A 4.0
B 2.0
C 1.0
D 1.0
答案 2 :(得分:1)