python-3.x - 根据多个条件替换观察值(即多行中的多列)
问题描述
我正在尝试根据两个条件(例如,特定日期之后的特定 ID)替换多个观察值中 3 列的值。
我见过类似的问题。
但是,它们并没有完全解决我的问题,或者我无法完全操纵它们来解决我的问题。
此代码将生成一个类似于我的数据框:
df = pd.DataFrame({'SUR_ID': {0:'SUR1', 1:'SUR1', 2:'SUR1', 3:'SUR1', 4:'SUR2', 5:'SUR2'}, 'DATE': {0:'05-01-2019', 1:'05-11-2019', 2:'06-15-2019', 3:'06-20-2019', 4: '05-15-2019', 5:'06-20-2019'}, 'ACTIVE_DATE': {0:'05-01-2019', 1:'05-01-2019', 2:'05-01-2019', 3:'05-01-2019', 4: '05-01-2019', 5:'05-01-2019'}, 'UTM_X': {0:'444895', 1:'444895', 2:'444895', 3:'444895', 4: '445050', 5:'445050'}, 'UTM_Y': {0:'4077528', 1:'4077528', 2:'4077528', 3:'4077528', 4: '4077762', 5:'4077762'}})
输出数据框:
我正在尝试做的事情:
我正在尝试将UTM_X、UTM_Y和ACTIVE_DATE 替换 为
[444917, 4077830, '06-04-2019']
什么时候
SUR_ID为“SUR1”且DATE >=“2019-06-04 12:00:00”
这是问题 1 解决方案的一个适应不良的版本,试图解决我的问题 - 抛出错误:
df.loc[[df['SUR_ID'] == 'SUR1' and df['DATE'] >='2019-06-04 12:00:00'], ['UTM_X', 'UTM_Y', 'Active_Date']] = [444917, 4077830, '06-04-2019']
解决方案
利用:
df['UTM_X']=df['UTM_X'].mask(df['SUR_ID'].eq('SUR1') & (pd.to_datetime(df['DATE'])>= pd.to_datetime("2019-06-04 12:00:00")),444917)
df['UTM_Y']=df['UTM_Y'].mask(df['SUR_ID'].eq('SUR1') & (pd.to_datetime(df['DATE'])>= pd.to_datetime("2019-06-04 12:00:00")),4077830)
df['ACTIVE_DATE']=df['ACTIVE_DATE'].mask(df['SUR_ID'].eq('SUR1') & (pd.to_datetime(df['DATE'])>= pd.to_datetime("2019-06-04 12:00:00")),'06-04-2019')
输出:
SUR_ID DATE ACTIVE_DATE UTM_X UTM_Y
0 SUR1 05-01-2019 05-01-2019 444895 4077528
1 SUR1 05-11-2019 05-01-2019 444895 4077528
2 SUR1 06-15-2019 06-04-2019 444917 4077830
3 SUR1 06-20-2019 06-04-2019 444917 4077830
4 SUR2 05-15-2019 05-01-2019 445050 4077762
5 SUR2 06-20-2019 05-01-2019 445050 4077762
推荐阅读
- python - 模板语法错误。无法解析剩余部分(Django)
- java - JavaFX StackPane 显示不正确的 (X,Y) 坐标
- android - 以编程方式启用/禁用通知访问
- python - 如何在 Spyder 中打印文档字符串?
- big-o - 需要帮助确定此陈述是否正确
- java - 在 Java 中使用“KeyY”进行形式验证无法证明数组重置循环
- swift - Swift 中的自定义结构初始化
- matlab - Matlab / Simulink polyfit
- c# - 如何在 2019 年将 ParseServer 与 Xamarin 一起使用?
- c++ - 模板参数推导的奇怪行为