获取pandas中每个标识符的最新非NaN时间序列值

时间:2016-07-23 00:04:18

标签: python pandas

我坚持如何获取唯一标识符的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或旋转数据框架的建议都将受到赞赏!

3 个答案:

答案 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)

这应该这样做:

df.ix[df.groupby('ID').Values.apply(lambda x: x.first_valid_index())]

enter image description here