首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >python中的非NaN值切片

python中的非NaN值切片
EN

Stack Overflow用户
提问于 2020-07-07 11:38:10
回答 4查看 438关注 0票数 0

我是python新手,希望得到一些帮助!我有一个名为“结果”的数据格式如下:

代码语言:javascript
运行
复制
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的每一行中的rfs的列表。请注意,我的前两列不是索引。我尝试了下面的代码,但无法得到答案:

代码语言:javascript
运行
复制
result_2=result.dropna(axis=1,how='all')

基本上,我想要一个日期列表,对于这些日期,rfs不是NaN。对于第一行中的ex,输出应该给我开始日期、结束日期和‘rf3 2’,类似地,在最后一行中,我的输出应该给我开始日期,结束日期,‘rf3 1’,‘rf3 2’,'rf3‘。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-07-07 11:44:15

您可以使用stackrfX列进行过滤,对索引进行groupby,并从结果组构建列表:

代码语言:javascript
运行
复制
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

或者使用列表理解:

代码语言:javascript
运行
复制
[[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]]

或者如果你需要列名。

代码语言:javascript
运行
复制
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]
票数 4
EN

Stack Overflow用户

发布于 2020-07-07 11:51:19

你可以使用pd.meltjoin

代码语言:javascript
运行
复制
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]
票数 3
EN

Stack Overflow用户

发布于 2020-07-07 12:17:19

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

代码语言:javascript
运行
复制
df2=df.select_dtypes(exclude='object').notna()#Excludes the dates

将列转换为numpy数组

代码语言:javascript
运行
复制
t=df2.columns.to_numpy()

生成一个列,布尔值被选中为null并连接到df。

代码语言:javascript
运行
复制
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]

如果感兴趣的是一个通用列表或所有在dataframe中不是空的列。

代码语言:javascript
运行
复制
df.notna().any(0).index.tolist()#find any nan on taxis=0 and add to list


 ['start', 'end', 'rf1', 'rf2', 'rf3']
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62774428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档