You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按日期分组筛选DataFrame行的条件查询需求及代码问题

问题:按日期和星期条件筛选DataFrame行

现有按日期(A列)排序的DataFrame数据如下:

索引ADE
02002-01-133.3Tuesday
12002-01-133.9Wednesday
22002-01-131.9Thursday
32002-01-139.0Saturday
42002-01-140.9Tuesday
52002-01-140.2Wednesday
62002-01-145.1Thursday
72002-01-147.0Friday
82002-01-141.9Saturday
92002-01-154.2Tuesday
102002-01-156.7Wednesday
112002-01-151.2Friday
122002-01-150.6Saturday

需求说明

需要生成新的DataFrame并按以下规则筛选行:

  • 若某日期同时包含"Thursday"和"Friday"(如2002-01-14),仅保留"Wednesday"至"Saturday"的行;
  • 其他日期(如2002-01-13、2002-01-15)保留"Tuesday"至"Saturday"的行。

期望输出如下:

索引ADE
02002-01-133.3Tuesday
12002-01-133.9Wednesday
22002-01-131.9Thursday
32002-01-139.0Saturday
52002-01-140.2Wednesday
62002-01-145.1Thursday
72002-01-147.0Friday
82002-01-141.9Saturday
92002-01-154.2Tuesday
102002-01-156.7Wednesday
112002-01-151.2Friday
122002-01-150.6Saturday

用户尝试的代码

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]

解决方案

先说说你现有代码的问题:

  1. m1和m2定义在循环外,没有针对每个分组动态计算,逻辑会出问题;
  2. 直接修改原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)

代码解释

  1. 构造示例数据:如果已经有原始DataFrame可以跳过这部分;
  2. filter_group函数:针对每个日期分组,先判断该分组是否同时存在"Thursday"和"Friday",再根据条件筛选对应星期的行;
  3. groupby.apply:对每个日期分组应用处理函数,最后自动合并所有符合条件的分组为新DataFrame;
  4. 可选重置索引:如果不需要保留原索引,可以添加reset_index(drop=True)来重置索引。

运行这段代码就能得到你想要的输出结果。


内容的提问来源于stack exchange,提问作者Tie_24

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:59:11