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

标签 python pandas

我一直在研究如何获取唯一标识符的 DataFrame 的最新非 NaN 值。所以我有一个带有 ID、值和年份列的 Pandas DataFrame,类似于:

  |  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 或旋转 DataFrame 的建议都将不胜感激!

最佳答案

另一个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

关于python - 获取 Pandas 中每个标识符的时间序列的最新非 NaN 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38536829/

相关文章:

python - 在 seaborn 情节上设置剪辑

python - 导入 Pandas 时保留 KDB 长纪元时间

python - 如何将特定值从一个数据帧填充到另一个数据帧

python - 所选行的值 > X 的列名称列表

python - 将数据框保存和加载到 csv 导致未命名列

python - Matplotlib Colorbar 更改刻度标签和定位器

python - 如果删除包含另一个对象的对象会怎样?

python - pyspark:根据另一个 RDD 的某些列过滤一个 RDD

python - 删除日期与 Pandas 中另一列的最大值对齐的行

python - 将系列广播到 DataFrame