Python 3.x 基于多个条件替换观测值(即多行中的多列)
我试图根据两个条件(例如,特定日期后的特定ID)替换多个观测值中3列的值 我见过类似的问题 然而,他们没有完全解决我的问题,或者我不能完全操纵他们来解决我的问题 此代码将生成一个类似于我的数据帧: 输出数据帧: 我想做什么: 我正在尝试用替换UTM_X、UTM_Y和活动日期 [4449174077830,'06-04-2019'] 什么时候 SUR_ID为“SUR1”,日期>=“2019-06-04 12:00:00” 这是问题1的解决方案的一个不太合适的版本,试图解决我的问题-抛出错误:Python 3.x 基于多个条件替换观测值(即多行中的多列),python-3.x,pandas,Python 3.x,Pandas,我试图根据两个条件(例如,特定日期后的特定ID)替换多个观测值中3列的值 我见过类似的问题 然而,他们没有完全解决我的问题,或者我不能完全操纵他们来解决我的问题 此代码将生成一个类似于我的数据帧: 输出数据帧: 我想做什么: 我正在尝试用替换UTM_X、UTM_Y和活动日期 [4449174077830,'06-04-2019'] 什么时候 SUR_ID为“SUR1”,日期>=“2019-06-04 12:00:00” 这是问题1的解决方案的一个不太合适的版本,试图解决我的问题-抛出错
首先确保列Date的类型为datetime,然后在使用2个条件时,它们需要分别位于括号之间。因此,您可以:
df.DATE = pd.to_datetime(df.DATE)
df.loc[ (df['SUR_ID'] == 'SUR1') & (df['DATE'] >= pd.to_datetime('2019-06-04 12:00:00')),
['UTM_X', 'UTM_Y', 'ACTIVE_DATE']] = [444917, 4077830, '06-04-2019']
请参见为布尔掩码编写的内容之间的差异:
[df['SUR_ID'] == 'SUR1' and df['DATE'] >='2019-06-04 12:00:00']
括号里是什么
(df['SUR_ID'] == 'SUR1') & (df['DATE'] >= pd.to_datetime('2019-06-04 12:00:00'))
使用:
输出:
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
谢谢你的澄清。很高兴知道我离基不太远。我在数据框中将date设置为date time,但我没有在条件中将其设置为datetime。@DevOnLiver确实不太远:),如果列date已经是datetime,则可能不需要在条件中将字符串转换为datetime,但这更严格
(df['SUR_ID'] == 'SUR1') & (df['DATE'] >= pd.to_datetime('2019-06-04 12:00:00'))
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