【问题标题】:Replace values in observations (i.e., multiple columns within multiple rows) based on multiple conditionals根据多个条件替换观察值(即多行中的多列)
【发布时间】:2019-08-28 19:32:19
【问题描述】:

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

我见过类似的问题。

  1. Pandas Multiple Conditions Function based on Column

  2. Pandas replace, multi column criteria

  3. Pandas: How do I assign values based on multiple conditions for existing columns?

  4. Replacing values in a pandas dataframe based on multiple conditions

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

这段代码会生成一个类似于我的数据框:

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.x pandas


    【解决方案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'))
    

    【讨论】:

    • 感谢您的澄清。很高兴知道我离基地不太远。
    • 我在数据框中将日期设置为日期时间,但我没有在条件中将其设置为日期时间。
    • @DevonOliver 确实不算太远 :) 如果您的 DATE 列已经是日期时间,那么在条件中将字符串转换为日期时间可能没有必要,但更严格
    【解决方案2】:

    用途:

    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
    

    【讨论】:

      猜你喜欢
      • 2016-11-16
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 2018-10-29
      • 1970-01-01
      • 2021-03-28
      • 1970-01-01
      • 2015-12-24
      相关资源
      最近更新 更多