基于Pandas实现:根据df1条件修改df2指定日期的flag值
用Pandas根据另一个DataFrame的条件修改数据
步骤说明
要实现需求,核心是先统一日期格式,再提取目标条件,最后通过布尔索引修改对应数据。
完整代码(可直接运行)
import pandas as pd # 初始化你的两个DataFrame df1 = pd.DataFrame({ 'name': ['abc', 'xyz'], 'date': ['4/11/2023', '2/8/2023'], 'flag': [1, 0] }) df2 = pd.DataFrame({ 'name': ['xyz']*8, 'date': ['2/6/2023', '2/7/2023', '2/8/2023', '2/9/2023', '2/10/2023', '2/11/2023', '2/12/2023', '2/13/2023'], 'flag': [0, 0, 0, 1, 1, 1, 1, 1] }) # 1. 把日期列转为datetime类型(必须步骤,否则字符串无法正确比较日期大小) df1['date'] = pd.to_datetime(df1['date']) df2['date'] = pd.to_datetime(df2['date']) # 2. 从df1中提取xyz对应的目标日期 target_date = df1.loc[df1['name'] == 'xyz', 'date'].iloc[0] # 3. 筛选df2中符合条件的行,修改flag值 df2.loc[(df2['name'] == 'xyz') & (df2['date'] < target_date), 'flag'] = 1 # 查看修改后的df2 print(df2)
代码解释
- 日期转换:
pd.to_datetime()把字符串格式的日期转成Pandas可识别的datetime类型,这样才能进行日期的大小比较。 - 提取目标日期:用
df1.loc[df1['name'] == 'xyz', 'date']筛选出xyz对应的日期行,再用.iloc[0]取出具体的日期值(因为返回的是一个Series,取第一个元素即可)。 - 修改flag:
df2.loc[条件, 'flag'] = 1是Pandas中修改指定行/列的标准写法,这里的条件是name为xyz且date早于目标日期,两个条件用&连接(注意要加括号)。
运行后df2的结果:
name date flag 0 xyz 2023-02-06 1 1 xyz 2023-02-07 1 2 xyz 2023-02-08 0 3 xyz 2023-02-09 1 4 xyz 2023-02-10 1 5 xyz 2023-02-11 1 6 xyz 2023-02-12 1 7 xyz 2023-02-13 1
内容的提问来源于stack exchange,提问作者Kavya shree
相关产品推荐
相关产品推荐

