如何仅对Pandas DataFrame的单列使用where方法
问题分析与解决
错误原因
你之前的代码错误地对整个DataFrame调用where方法并指定axis=1,导致当ID>5不成立时,整行数据被替换为日期值,最终NAME、ID等非日期列也被修改为日期类型,完全偏离了仅修改Result Date列的需求。
正确实现方式
针对仅修改Result Date列的需求,有以下几种简洁的实现方法:
方法一:对单个列使用where
where方法的逻辑是:条件为True时保留原列值,False时使用替换值。直接对Result Date列调用该方法即可:
import pandas as pd my_dict={'NAME':['Ravi','Raju','Alex','Ron','King','Jack'], 'ID':[1,2,3,4,5,6], 'MATH':[80,40,70,70,82,30], 'ENGLISH':[81,70,40,50,60,30], 'Result Date': ['2021-08-01', '2021-04-24', '2021-09-30', '2021-07-13', '2021-09-30', '2021-07-13'], } my_data = pd.DataFrame(data=my_dict) my_data['Result Date'] = pd.to_datetime(my_data['Result Date']) # 仅对Result Date列执行where操作 my_data['Result Date'] = my_data['Result Date'].where(my_data["ID"] > 5, my_data['Result Date'] + pd.Timedelta(days=14)) print(my_data)
方法二:使用numpy.where
通过numpy.where可以更直观地实现条件赋值:
import pandas as pd import numpy as np # ... 前面的DataFrame初始化代码不变 my_data['Result Date'] = np.where( my_data["ID"] > 5, # 判断条件 my_data['Result Date'], # 条件为True时的值 my_data['Result Date'] + pd.Timedelta(days=14) # 条件为False时的值 )
方法三:用loc直接赋值(最直观)
通过loc定位到需要修改的行和列,直接进行增量赋值:
import pandas as pd # ... 前面的DataFrame初始化代码不变 # 对ID<=5的行,给Result Date加14天 my_data.loc[my_data["ID"] <= 5, 'Result Date'] += pd.Timedelta(days=14)
执行结果
以上三种方法都会得到你想要的预期结果:
- ID≤5的行,
Result Date都增加了14天 - ID=6的行(Jack),
Result Date保持原日期2021-07-13不变 - 其他列(NAME、ID、MATH、ENGLISH)的数据完全不受影响
内容的提问来源于stack exchange,提问作者Kingston X
相关产品推荐
相关产品推荐

