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

基于双条件为Python数据表新增列:标记国家年度首个日期

问题与解法

需求与原数据

现有如下数据表,需要新增一列:若该行是对应国家对应年份的首个日期(即该组内最小日期),标记为1,否则标记为0。

CountryYearDate
Spain20202020-08-10
Germany20202020-08-10
Italy20192020-08-11
Spain20192020-08-20
Spain20202020-06-10

你尝试的自定义函数存在几个问题:

  • 直接操作全局DataFrame,没有基于传入的行数据判断
  • x==1是比较运算符,不是赋值,应该用x=1
  • 函数没有返回值,无法生成结果
  • 逐行处理的思路效率低下,不符合Pandas的使用习惯

最优解法(Pandas矢量化操作)

推荐用groupby结合transform实现,高效且简洁:

import pandas as pd

# 构造示例数据(已有df可跳过)
data = {
    "Country": ["Spain", "Germany", "Italy", "Spain", "Spain"],
    "Year": [2020, 2020, 2019, 2019, 2020],
    "Date": ["2020-08-10", "2020-08-10", "2020-08-11", "2020-08-20", "2020-06-10"]
}
df = pd.DataFrame(data)

# 先将Date转为日期类型,确保日期比较准确
df["Date"] = pd.to_datetime(df["Date"])

# 新增标记列
df["IsFirstDate"] = df.groupby(["Country", "Year"])["Date"].transform(lambda x: x == x.min()).astype(int)

print(df)

运行后得到结果:

CountryYearDateIsFirstDate
Spain20202020-08-100
Germany20202020-08-101
Italy20192020-08-111
Spain20192020-08-201
Spain20202020-06-101

逻辑说明

  1. groupby(["Country", "Year"]):按国家和年份分组,把相同国家同年份的数据归为一组
  2. transform(lambda x: x == x.min()):在每个组内,判断每行的日期是否等于该组的最小日期,返回布尔值(True/False)
  3. astype(int):把布尔值转为1/0,符合需求的标记格式

若坚持使用自定义函数(不推荐)

如果一定要用自定义函数,需要修正逻辑并结合apply逐行处理:

def first_date(row):
    # 根据当前行的国家和年份,筛选对应组的最小日期
    min_date = df[(df["Country"] == row["Country"]) & (df["Year"] == row["Year"])]["Date"].min()
    # 比较当前行日期,返回1或0
    return 1 if row["Date"] == min_date else 0

df["IsFirstDate"] = df.apply(first_date, axis=1)

注意:这种方法在数据量较大时,效率远低于矢量化操作,因此优先推荐第一种解法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 20:30:51