亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 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 關注
  • 168 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號