为了账号安全,请及时绑定邮箱和手机立即绑定

在 python 中切片非 NaN 值

在 python 中切片非 NaN 值

烙印99 2023-02-22 17:10:00
我是 python 新手,希望得到一些帮助!我有一个名为 result 的数据框,格式如下:start       end         rf1 rf2 rf301-01-2008  10-01-2008  nan 12  nan02-01-2008  11-01-2008  nan 16  nan03-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'
查看完整描述

4 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

IIUC 您可以使用对列、索引stack进行过滤并从结果组构建列表:rfXgroupby


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]


查看完整回答
反对 回复 2023-02-22
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

IIUC,你可以使用pd.melt和join


s = (

    pd.melt(df, id_vars=["start", "end"])

    .dropna()

    .groupby(["start", "end"])["variable"]

    .agg(list)

    .to_frame("vals")

)


df1 = df.set_index(['start','end']).join(s)


print(df1)


                        rf1  rf2   rf3             vals

start      end                                         

2008-01-01 2008-10-01   NaN   12   NaN            [rf2]

2008-02-01 2008-11-01   NaN   16   NaN            [rf2]

2008-03-01 2008-12-01  32.0   18  18.0  [rf1, rf2, rf3]


查看完整回答
反对 回复 2023-02-22
?
青春有我

TA贡献1784条经验 获得超8个赞

使用 .select_dtypes 排除不需要的列并查找剩余满足条件的列


df2=df.select_dtypes(exclude='object').notna()#Excludes the dates

将列转换为 numpy 数组


t=df2.columns.to_numpy()

生成一个系列,其中列布尔值选择为非空并加入 df


df.join(pd.DataFrame({'listofcols':[t[i] for i in df2.to_numpy()]}))


       start         end   rf1  rf2   rf3       listofcols

0  01-01-2008  10-01-2008   NaN   12   NaN            [rf2]

1  02-01-2008  11-01-2008   NaN   16   NaN            [rf2]

2  03-01-2008  12-01-2008  32.0   18  18.0  [rf1, rf2, rf3]

如果对一般列表或数据框中不为空的所有列感兴趣


df.notna().any(0).index.tolist()#find any nan on taxis=0 and add to list



 ['start', 'end', 'rf1', 'rf2', 'rf3']


查看完整回答
反对 回复 2023-02-22
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

一种选择是列表理解:

[[x1 for x1 in x if pd.notnull(x1)] for x in df[['rf1', 'rf2', 'rf3']].values]


查看完整回答
反对 回复 2023-02-22
  • 4 回答
  • 0 关注
  • 148 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号