首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python Pandas -按多个列分组,过滤特定值特定列,以及填充

Python Pandas -按多个列分组,过滤特定值特定列,以及填充
EN

Stack Overflow用户
提问于 2018-08-23 09:01:54
回答 1查看 1.9K关注 0票数 0

我有一个包含杂乱数据的大型数据集。数据如下所示:

代码语言:javascript
复制
df1 = pd.DataFrame({'Batch':[1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2],
                    'Case':[1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2],
                    'Live':['Yes', 'Yes', 'No', 'Yes', 'No', 'No', 'Yes', 'Yes', 'Yes', 'Yes', 'Yes', 'No', 'Yes', 'Yes', 'No'],
                    'Task':['Download', nan, 'Download', 'Report', 'Report', nan, 'Download', nan, nan, nan, 'Download', 'Download', 'Report', nan, 'Report']

    })

出于示例的目的,请假设'nan‘实际上是一个空单元格(而不是表示’nan‘的字符串)

我需要按'Batch‘分组,然后按'Case’分组,筛选出'Live‘值为'Yes’的实例,然后向下填充。

我本质上希望它看起来像this

我目前的方法是:

代码语言:javascript
复制
df['Task'] = df.groupby(['Batch','Case'])['Live'].filter(lambda x: x == 'Yes')['Task'].fillna(method='ffill')

我尝试了许多变体,但总是收到诸如“过滤器必须返回布尔结果”之类的错误。

有人知道我该怎么做吗?

EN

回答 1

Stack Overflow用户

发布于 2018-08-23 09:10:16

你不需要在groupby之前切片,你可以在filter之前切片

代码语言:javascript
复制
df1.Task=df1.loc[df1.Live=='Yes'].groupby(['Batch','Case']).Task.ffill()
df1
Out[620]: 
    Batch  Case Live      Task
0       1     1  Yes  Download
1       1     1  Yes  Download
2       1     1   No       NaN
3       1     2  Yes    Report
4       1     2   No       NaN
5       1     2   No       NaN
6       1     2  Yes  Download
7       1     2  Yes  Download
8       1     2  Yes  Download
9       2     1  Yes       NaN
10      2     1  Yes  Download
11      2     1   No       NaN
12      2     2  Yes    Report
13      2     2  Yes    Report
14      2     2   No       NaN
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51977012

复制
相关文章

相似问题

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