按日期分组筛选DataFrame行的条件查询需求及代码问题
问题:按日期和星期条件筛选DataFrame行
现有按日期(A列)排序的DataFrame数据如下:
| 索引 | A | D | E |
|---|---|---|---|
| 0 | 2002-01-13 | 3.3 | Tuesday |
| 1 | 2002-01-13 | 3.9 | Wednesday |
| 2 | 2002-01-13 | 1.9 | Thursday |
| 3 | 2002-01-13 | 9.0 | Saturday |
| 4 | 2002-01-14 | 0.9 | Tuesday |
| 5 | 2002-01-14 | 0.2 | Wednesday |
| 6 | 2002-01-14 | 5.1 | Thursday |
| 7 | 2002-01-14 | 7.0 | Friday |
| 8 | 2002-01-14 | 1.9 | Saturday |
| 9 | 2002-01-15 | 4.2 | Tuesday |
| 10 | 2002-01-15 | 6.7 | Wednesday |
| 11 | 2002-01-15 | 1.2 | Friday |
| 12 | 2002-01-15 | 0.6 | Saturday |
需求说明
需要生成新的DataFrame并按以下规则筛选行:
- 若某日期同时包含"Thursday"和"Friday"(如2002-01-14),仅保留"Wednesday"至"Saturday"的行;
- 其他日期(如2002-01-13、2002-01-15)保留"Tuesday"至"Saturday"的行。
期望输出如下:
| 索引 | A | D | E |
|---|---|---|---|
| 0 | 2002-01-13 | 3.3 | Tuesday |
| 1 | 2002-01-13 | 3.9 | Wednesday |
| 2 | 2002-01-13 | 1.9 | Thursday |
| 3 | 2002-01-13 | 9.0 | Saturday |
| 5 | 2002-01-14 | 0.2 | Wednesday |
| 6 | 2002-01-14 | 5.1 | Thursday |
| 7 | 2002-01-14 | 7.0 | Friday |
| 8 | 2002-01-14 | 1.9 | Saturday |
| 9 | 2002-01-15 | 4.2 | Tuesday |
| 10 | 2002-01-15 | 6.7 | Wednesday |
| 11 | 2002-01-15 | 1.2 | Friday |
| 12 | 2002-01-15 | 0.6 | Saturday |
用户尝试的代码
m1 = (group["E"] == "Wednesday") m2 = (group["E"] == "Thursday") grouped = df.groupby("A") for idx, group in grouped: if (m1|m2).any(): df[idx] = group[m1|m2] else: df[idx] = group[m2]
解决方案
先说说你现有代码的问题:
m1和m2定义在循环外,没有针对每个分组动态计算,逻辑会出问题;- 直接修改原
df[idx]的方式不对,应该收集符合条件的分组后合并成新DataFrame。
推荐用groupby().apply()的方式,对每个分组单独处理后合并,代码如下:
import pandas as pd # 构造示例DataFrame(已有原始数据可跳过) data = { "A": ["2002-01-13"]*4 + ["2002-01-14"]*5 + ["2002-01-15"]*4, "D": [3.3, 3.9, 1.9, 9.0, 0.9, 0.2, 5.1, 7.0, 1.9, 4.2, 6.7, 1.2, 0.6], "E": ["Tuesday", "Wednesday", "Thursday", "Saturday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Tuesday", "Wednesday", "Friday", "Saturday"] } df = pd.DataFrame(data) # 定义分组处理函数 def filter_group(group): # 检查当前日期分组是否同时包含Thursday和Friday has_thu_and_fri = (group["E"] == "Thursday").any() and (group["E"] == "Friday").any() if has_thu_and_fri: # 保留Wednesday到Saturday的行 return group[group["E"].isin(["Wednesday", "Thursday", "Friday", "Saturday"])] else: # 保留Tuesday到Saturday的行 return group[group["E"].isin(["Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"])] # 分组处理并合并结果 new_df = df.groupby("A", group_keys=False).apply(filter_group) # 可选:重置索引(不需要原索引的话添加这行) # new_df = new_df.reset_index(drop=True) print(new_df)
代码解释
- 构造示例数据:如果已经有原始DataFrame可以跳过这部分;
- filter_group函数:针对每个日期分组,先判断该分组是否同时存在"Thursday"和"Friday",再根据条件筛选对应星期的行;
- groupby.apply:对每个日期分组应用处理函数,最后自动合并所有符合条件的分组为新DataFrame;
- 可选重置索引:如果不需要保留原索引,可以添加
reset_index(drop=True)来重置索引。
运行这段代码就能得到你想要的输出结果。
内容的提问来源于stack exchange,提问作者Tie_24
相关产品推荐
相关产品推荐

