如何在Python中基于日期条件更新DataFrame列值并清除指定列数据
问题:基于日期条件更新DataFrame多列值
需要根据DataFrame中的日期条件,同时完成两个操作:更新status列的值为'open',并清空对应行的value1和value2列数据。当前代码仅修改了status列,未处理value1和value2。
原始数据
id date location status value1 value2 CC 1/1/2022 ny new 12 1 CC 4/1/2022 ny new 1 1 CC 7/1/2022 ny new 1 1 CC 10/1/2022 ny new 1 2 CC 1/1/2023 ny ok 1 2 CC 4/1/2023 ny ok 1 2 CC 7/1/2023 ny ok 1 3 CC 10/1/2023 ny ok 1 3 BB 1/1/2022 ca new 1 3 BB 4/1/2022 ca new 1 3 BB 7/1/2022 ca new 1 3 BB 10/1/2022 ca new 12 3 BB 1/1/2023 ca new 2 3 BB 4/1/2023 ca new 2 3 BB 7/1/2023 ca new 2 3 BB 10/1/2023 ca new 2 3
期望结果
id date location status value1 value2 CC 1/1/2022 ny open CC 4/1/2022 ny open CC 7/1/2022 ny open CC 10/1/2022 ny new 1 2 CC 1/1/2023 ny ok 1 2 CC 4/1/2023 ny ok 1 2 CC 7/1/2023 ny ok 1 3 CC 10/1/2023 ny ok 1 3 BB 1/1/2022 ca new 1 3 BB 4/1/2022 ca new 1 3 BB 7/1/2022 ca new 1 3 BB 10/1/2022 ca new 12 3 BB 1/1/2023 ca new 2 3 BB 4/1/2023 ca new 2 3 BB 7/1/2023 ca new 2 3 BB 10/1/2023 ca new 2 3
当前尝试的代码
df.loc[(df.id == 'cc') & (df.date <= '07/01/2022'), 'status']= 'open'
存在的问题
- 仅修改了
status列,未清空value1和value2 id的匹配值为小写'cc',与数据中的大写'CC'不匹配,会导致筛选失效
解决方案
步骤1:统一日期格式(可选但推荐)
先将date列转为datetime类型,避免字符串比较的格式问题:
import pandas as pd df['date'] = pd.to_datetime(df['date'])
步骤2:一次性更新多列
通过df.loc同时指定需要修改的列,完成批量更新:
# 定义筛选条件:id为CC且日期不晚于2022-07-01 mask = (df['id'] == 'CC') & (df['date'] <= '2022-07-01') # 同时更新status为'open',清空value1和value2 df.loc[mask, ['status', 'value1', 'value2']] = ['open', '', '']
如果希望用缺失值而非空字符串,可以将''替换为pd.NA:
df.loc[mask, ['status', 'value1', 'value2']] = ['open', pd.NA, pd.NA]
说明
- 该方法通过一次
loc操作完成多列赋值,效率更高 - 修正了
id匹配的大小写问题,确保筛选出正确的行 - 若不转datetime类型,需保证日期字符串格式完全一致(比如用
'7/1/2022'而非'07/01/2022')
内容的提问来源于stack exchange,提问作者Lynn
相关产品推荐
相关产品推荐

