首页 > 解决方案 > 根据多个条件替换观察值(即多行中的多列)

问题描述

我正在尝试根据两个条件(例如,特定日期之后的特定 ID)替换多个观察值中 3 列的值。

我见过类似的问题。

  1. Pandas 基于列的多条件函数

  2. 熊猫替换,多列标准

  3. Pandas:如何根据现有列的多个条件分配值?

  4. 根据多个条件替换熊猫数据框中的值

但是,它们并没有完全解决我的问题,或者我无法完全操纵它们来解决我的问题。

此代码将生成一个类似于我的数据框:

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_XUTM_YACTIVE_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']

标签: python-3.xpandas

解决方案


利用:

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

推荐阅读