python - 如果遇到 NaN 值,将值移到 Python DataFrame 的顶部

标签 python numpy pandas

我正在使用不规则的 df。我试图摆脱最初的 NaN 并将所有值移到顶部,将 NaN 留在底部。我想重新调整顶部的值,忽略日期。

============================================= ===================

STRIP      col1  col2   col3  col4  col5  col6  col7 col8
01/12/2011  0.8   NaN   NaN   NaN   NaN   NaN   NaN  NaN
01/01/2012  0.8   0.8   NaN   NaN   NaN   NaN   NaN  NaN
01/02/2012  0.8   0.8   0.78  NaN   NaN   NaN   NaN  NaN
01/03/2012  0.8   0.8   0.75  0.7   0.6   NaN   NaN  NaN
01/04/2012  0.7   0.7   0.73  0.7   0.6   0.6   NaN  NaN
01/05/2012  0.7   0.7   0.72  0.7   0.6   0.6   0.1  NaN
01/06/2012  0.7   0.7   0.70  0.7   0.6   0.6   0.2  0.7
01/07/2012  0.7   0.7   0.69  0.7   0.6   0.6   0.3  0.9
01/08/2012  0.7   0.7   0.68  0.7   0.6   0.6   0.4  0.6
01/09/2012  0.7   0.7   0.67  0.7   0.6   0.6   0.5  0.4
02/01/2013  NaN   NaN   NaN   NaN   0.5   0.6   0.8  0.3
03/01/2013  NaN   NaN   NaN   NaN   0.5   0.6   0.7  0.2

============================================= ====================
最终的 DataFrame 应如下所示:

STRIP      col1  col2  col3  col4  col5  col6  col7  col8
01/12/2011  0.8  0.8   0.78  0.7   0.6   0.6    0.1  0.7
01/01/2012  0.8  0.8   0.75  0.7   0.6   0.6    0.2  0.9
01/02/2012  0.8  0.8   0.73  0.7   0.6   0.6    0.3  0.6
01/03/2012  0.8  0.7   0.72  0.7   0.6   0.6    0.4  0.4
01/04/2012  0.7  0.7   0.7   0.7   0.6   0.6    0.5  0.3
01/05/2012  0.7  0.7   0.69  0.7   0.6   0.6    0.6  0.2
01/06/2012  0.7  0.7   0.68  0.7   0.6   0.6    0.7  NaN
01/07/2012  0.7  0.7   0.67  NaN   0.5   0.6    NaN  NaN
01/08/2012  0.7  0.7   NaN   NaN   0.5   NaN    NaN  NaN
01/09/2012  0.7  NaN   NaN   NaN   NaN   NaN    NaN  NaN
02/01/2013  NaN  NaN   NaN   NaN   NaN   NaN    NaN  NaN
03/01/2013  NaN  NaN   NaN   NaN   NaN   NaN    NaN  NaN

最佳答案

您遍历列并使用 first_valid_indexget_loc shift列值:

In [314]:
for col in df:
    df[col] = df[col].shift(-df.index.get_loc(df[col].first_valid_index()))
df

Out[314]:
            col1  col2  col3  col4  col5  col6  col7  col8
STRIP                                                     
01/12/2011   0.8   0.8  0.78   0.7   0.6   0.6   0.1   0.7
01/01/2012   0.8   0.8  0.75   0.7   0.6   0.6   0.2   0.9
01/02/2012   0.8   0.8  0.73   0.7   0.6   0.6   0.3   0.6
01/03/2012   0.8   0.7  0.72   0.7   0.6   0.6   0.4   0.4
01/04/2012   0.7   0.7  0.70   0.7   0.6   0.6   0.5   0.3
01/05/2012   0.7   0.7  0.69   0.7   0.6   0.6   0.8   0.2
01/06/2012   0.7   0.7  0.68   0.7   0.6   0.6   0.7   NaN
01/07/2012   0.7   0.7  0.67   NaN   0.5   0.6   NaN   NaN
01/08/2012   0.7   0.7   NaN   NaN   0.5   NaN   NaN   NaN
01/09/2012   0.7   NaN   NaN   NaN   NaN   NaN   NaN   NaN
02/01/2013   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
03/01/2013   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN

另一种使用apply的方法:

In [317]:
df.apply(lambda x: x.shift(-x.index.get_loc(x.first_valid_index())))

Out[317]:
            col1  col2  col3  col4  col5  col6  col7  col8
STRIP                                                     
01/12/2011   0.8   0.8  0.78   0.7   0.6   0.6   0.1   0.7
01/01/2012   0.8   0.8  0.75   0.7   0.6   0.6   0.2   0.9
01/02/2012   0.8   0.8  0.73   0.7   0.6   0.6   0.3   0.6
01/03/2012   0.8   0.7  0.72   0.7   0.6   0.6   0.4   0.4
01/04/2012   0.7   0.7  0.70   0.7   0.6   0.6   0.5   0.3
01/05/2012   0.7   0.7  0.69   0.7   0.6   0.6   0.8   0.2
01/06/2012   0.7   0.7  0.68   0.7   0.6   0.6   0.7   NaN
01/07/2012   0.7   0.7  0.67   NaN   0.5   0.6   NaN   NaN
01/08/2012   0.7   0.7   NaN   NaN   0.5   NaN   NaN   NaN
01/09/2012   0.7   NaN   NaN   NaN   NaN   NaN   NaN   NaN
02/01/2013   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
03/01/2013   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN

编辑

如果“STRIP”是一列,那么您不需要 get_loc:

In [319]:
df.apply(lambda x: x.shift(-x.first_valid_index()))

Out[319]:
         STRIP  col1  col2  col3  col4  col5  col6  col7  col8
0   01/12/2011   0.8   0.8  0.78   0.7   0.6   0.6   0.1   0.7
1   01/01/2012   0.8   0.8  0.75   0.7   0.6   0.6   0.2   0.9
2   01/02/2012   0.8   0.8  0.73   0.7   0.6   0.6   0.3   0.6
3   01/03/2012   0.8   0.7  0.72   0.7   0.6   0.6   0.4   0.4
4   01/04/2012   0.7   0.7  0.70   0.7   0.6   0.6   0.5   0.3
5   01/05/2012   0.7   0.7  0.69   0.7   0.6   0.6   0.8   0.2
6   01/06/2012   0.7   0.7  0.68   0.7   0.6   0.6   0.7   NaN
7   01/07/2012   0.7   0.7  0.67   NaN   0.5   0.6   NaN   NaN
8   01/08/2012   0.7   0.7   NaN   NaN   0.5   NaN   NaN   NaN
9   01/09/2012   0.7   NaN   NaN   NaN   NaN   NaN   NaN   NaN
10  02/01/2013   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
11  03/01/2013   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN

关于python - 如果遇到 NaN 值,将值移到 Python DataFrame 的顶部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33676133/

相关文章:

python - matplotlib "fail to allocate bitmap"经过一些迭代

python - 在 CSV 中搜索匹配字段并使用初始日期

python - pandas - 带有时间序列数据的堆积条形图

python - 将二维数组中的每个值乘以另一个二维数组中的对应值

python - 使用切片/索引在矩阵内切换 numpy 向量

python Pandas : sum with string in two dataframe

python - 使用 seaborn.swarmplot 将数据点映射到颜色图

python - 测试需要用户输入的 Python 函数()

Python 未全部运行

python - 查找二维 numpy 数组的相对最大值