首页 > 解决方案 > 在python中切片不是NaN值

问题描述

我是 python 新手,希望能得到一些帮助!我有一个名为 result 的数据框,格式如下:

start       end         rf1 rf2 rf3
01-01-2008  10-01-2008  nan 12  nan
02-01-2008  11-01-2008  nan 16  nan
03-01-2008  12-01-2008  32  18  18

我想要每行中不是 NaN 的那些 rf 的列表。请注意,我的前两列不是索引。我尝试了下面的代码,但无法得到我的答案:

result_2=result.dropna(axis=1,how='all')

基本上我想要一个 rfs 不是 NaN 的日期列表。对于第一行中的 ex,我的输出应该给我开始日期、结束日期和 'rf2',同样在最后一行,我的输出应该给我开始日期、结束日期、'rf1'、'rf2'、'rf3'

标签: pythonpandasnumpyslicenan

解决方案


您可以使用 IIUCstack过滤rfX列、groupby索引并从结果组中构建列表:

df.filter(regex=r'rf\d').stack().groupby(level=0).agg(list)

0                [12.0]
1                [16.0]
2    [32.0, 18.0, 18.0]
dtype: object

或使用列表推导:

[[i for i in row if i==i] for row in df.filter(regex=r'rf\d').values.tolist()]
 [[12.0], [16.0], [32.0, 18.0, 18.0]]

或者如果您需要列名。

df['vals'] = df.filter(regex=r'rf\d').stack().reset_index(level=1)\
                                     .groupby(level=0).level_1.agg(list)

print(df)

       start        end   rf1  rf2   rf3             vals
0 2008-01-01 2008-10-01   NaN   12   NaN            [rf2]
1 2008-02-01 2008-11-01   NaN   16   NaN            [rf2]
2 2008-03-01 2008-12-01  32.0   18  18.0  [rf1, rf2, rf3]

推荐阅读