python - 如果单行的条件为真,则标记整个组

标签 python pandas dataframe group-by pandas-groupby

我有一个包含日期和公共(public)假期的数据框

Date    WeekNum Public_Holiday
1/1/2015    1   1
2/1/2015    1   0
3/1/2015    1   0
4/1/2015    1   0
5/1/2015    1   0
6/1/2015    1   0
7/1/2015    1   0
8/1/2015    2   0
9/1/2015    2   0
10/1/2015   2   0
11/1/2015   2   0
12/1/2015   2   0
13/1/2015   2   0

我必须创建一个名为 Public_Holiday_Week 的条件列,如果该特定周有公共(public)假期,它应该返回 1

我想看到这样的输出

Date    WeekNum Public_Holiday  Public_Holiday_Week
1/1/2015    1   1               1
2/1/2015    1   0               1
3/1/2015    1   0               1
4/1/2015    1   0               1
5/1/2015    1   0               1
6/1/2015    1   0               1
7/1/2015    1   0               1
8/1/2015    2   0               0
9/1/2015    2   0               0
10/1/2015   2   0               0
11/1/2015   2   0               0
12/1/2015   2   0               0
13/1/2015   2   0               0

我尝试使用 np.where

df['Public_Holiday_Week'] = np.where(df['Public_Holiday']==1,1,0)

但是当它不是公众假期时,它适用于一周中的其他日子。

我必须在这里申请滚动吗?感谢您的帮助

最佳答案

为了提高性能,不要使用 groupby,而是获取所有 WeekNum 至少有一个 1,然后通过 isin 选择值, 最后将 bool 掩码转换为 ints:

weeks = df.loc[df['Public_Holiday'].eq(1), 'WeekNum']
df['Public_Holiday_Week'] = df['WeekNum'].isin(weeks).astype(int)

print (df)
         Date  WeekNum  Public_Holiday  Public_Holiday_Week
0    1/1/2015        1               1                    1
1    2/1/2015        1               0                    1
2    3/1/2015        1               0                    1
3    4/1/2015        1               0                    1
4    5/1/2015        1               0                    1
5    6/1/2015        1               0                    1
6    7/1/2015        1               0                    1
7    8/1/2015        2               0                    0
8    9/1/2015        2               0                    0
9   10/1/2015        2               0                    0
10  11/1/2015        2               0                    0
11  12/1/2015        2               0                    0
12  13/1/2015        2               0                    0

正如@Mohamed Thasin 指出的那样,如果有必要,可以按周分组,但随后会得到不同的输出,因为不同 week数字:

df['weeks'] = pd.to_datetime(df['Date'], dayfirst=True).dt.week

weeks = df.loc[df['Public_Holiday'].eq(1), 'weeks']
df['Public_Holiday_Week'] = df['weeks'].isin(weeks).astype(int)
print (df)
         Date  WeekNum  Public_Holiday  weeks  Public_Holiday_Week
0    1/1/2015        1               1      1                    1
1    2/1/2015        1               0      1                    1
2    3/1/2015        1               0      1                    1
3    4/1/2015        1               0      1                    1
4    5/1/2015        1               0      2                    0
5    6/1/2015        1               0      2                    0
6    7/1/2015        1               0      2                    0
7    8/1/2015        2               0      2                    0
8    9/1/2015        2               0      2                    0
9   10/1/2015        2               0      2                    0
10  11/1/2015        2               0      2                    0
11  12/1/2015        2               0      3                    0
12  13/1/2015        2               0      3                    0

关于python - 如果单行的条件为真,则标记整个组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51016638/

相关文章:

python - 主动份额措施的计算

python - 如何检查元组中是否包含某个单词,如果包含,则将其删除

python - 在一个单元格中转换具有多个值的数据框

python - pandas groupby 有很多键

python - 有效地将带有嵌入数组的字典列表转换为 DataFrame

python - Pandas 与独特的比赛融为一体

python - 使用 Pandas DateOffset 移动到给定时间的最近过去的日期时间

python - 关系不存在 - Django 和 Postgres

python - 字典到数据帧错误: "If using all scalar values, you must pass an index"

python - 如何为大型(200,000 多条记录)集合运行 pymongo 聚合查询?