python - 在 Pandas 数据框中跨行获取最后一个非 na 值

标签 python pandas multidimensional-array dataframe na

我有一个形状为 (40,500) 的数据框。数据框中的每一行都有一些数值,直到某个可变列号 k,之后的所有条目都是 nan。

我正在尝试获取每行中最后一个非 nan 列的值。有没有一种方法可以在不循环遍历数据帧的所有行的情况下执行此操作?

示例数据框:

2016-06-02 7.080 7.079 7.079 7.079 7.079 7.079   nan   nan   nan
2016-06-08 7.053 7.053 7.053 7.053 7.053 7.054   nan   nan   nan  
2016-06-09 7.061 7.061 7.060 7.060 7.060 7.060   nan   nan   nan   
2016-06-14   nan   nan   nan   nan   nan   nan   nan   nan   nan  
2016-06-15 7.066 7.066 7.066 7.066   nan   nan   nan   nan   nan  
2016-06-16 7.067 7.067 7.067 7.067 7.067 7.067 7.068 7.068   nan  
2016-06-21 7.053 7.053 7.052   nan   nan   nan   nan   nan   nan  
2016-06-22 7.049 7.049   nan   nan   nan   nan   nan   nan   nan  
2016-06-28 7.058 7.058 7.059 7.059 7.059 7.059 7.059 7.059 7.059  

要求输出

2016-06-02 7.079 
2016-06-08 7.054
2016-06-09 7.060
2016-06-14   nan 
2016-06-15 7.066
2016-06-16 7.068 
2016-06-21 7.052 
2016-06-22 7.049
2016-06-28 7.059  

最佳答案

你需要last_valid_index使用自定义函数,因为如果所有值都是 NaN 它返回 KeyError:

def f(x):
    if x.last_valid_index() is None:
        return np.nan
    else:
        return x[x.last_valid_index()]

df['status'] = df.apply(f, axis=1)
print (df)
                1      2      3      4      5      6      7      8      9  \
0                                                                           
2016-06-02  7.080  7.079  7.079  7.079  7.079  7.079    NaN    NaN    NaN   
2016-06-08  7.053  7.053  7.053  7.053  7.053  7.054    NaN    NaN    NaN   
2016-06-09  7.061  7.061  7.060  7.060  7.060  7.060    NaN    NaN    NaN   
2016-06-14    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN   
2016-06-15  7.066  7.066  7.066  7.066    NaN    NaN    NaN    NaN    NaN   
2016-06-16  7.067  7.067  7.067  7.067  7.067  7.067  7.068  7.068    NaN   
2016-06-21  7.053  7.053  7.052    NaN    NaN    NaN    NaN    NaN    NaN   
2016-06-22  7.049  7.049    NaN    NaN    NaN    NaN    NaN    NaN    NaN   
2016-06-28  7.058  7.058  7.059  7.059  7.059  7.059  7.059  7.059  7.059   

            status  
0                   
2016-06-02   7.079  
2016-06-08   7.054  
2016-06-09   7.060  
2016-06-14     NaN  
2016-06-15   7.066  
2016-06-16   7.068  
2016-06-21   7.052  
2016-06-22   7.049  
2016-06-28   7.059  

替代解决方案 - fillna使用方法 ffill 并通过 iloc 选择最后一列:

df['status'] = df.ffill(axis=1).iloc[:, -1]
print (df)
            status  
0                   
2016-06-02   7.079  
2016-06-08   7.054  
2016-06-09   7.060  
2016-06-14     NaN  
2016-06-15   7.066  
2016-06-16   7.068  
2016-06-21   7.052  
2016-06-22   7.049  
2016-06-28   7.059  

关于python - 在 Pandas 数据框中跨行获取最后一个非 na 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40583482/

相关文章:

python - 将两个数据集中的名称替换为 ID

javascript - 除了嵌套for循环之外的多维js[数组的数组]的现代查询方法

python - 如果 Dict 值为 null

python - Pandas 日期时间列的矢量化操作

python - Python pip freeze 中的三重等号和 ubuntu2 是什么?

python - 空 DataFrame 上的 Pandas groupby 导致没有列

c++ - 错误 C2143 和错误 C2059 在 ";"之前缺少 "{"

php - 内爆二维数组中的数据

python - 如何在 App Engine 中表示一对一关系

python - Seaborn Plot 包括相同数据的不同分布