【问题标题】:Assign masked value to different row in pandas将屏蔽值分配给熊猫中的不同行
【发布时间】:2021-10-26 05:37:18
【问题描述】:

我有一个熊猫数据框

df =     code       mapper       version  country  range    month              value
1       ABC321       ABC          Alpha     USA     High   2021-10              8.0
6       ABC321       ABC          Alpha     USA     High   2021-11              1.0
2       ABC321       PQS          Beta      IND     LOW    2021-10              0.0
3       ABC321       TRR          Delta     MEX     LOW    2021-10              1.0
4       ABC321       TRR          Delta     MEX     LOW    2021-11              3.0

我正在根据条件屏蔽该行并将值设为零


mask = (
    (df.mapper == 'ABC')
    & (df.version == 'Alpha')
    & (df.country == 'USA')
    & (df.range == 'High')
    & (df.month == '2021-10')
)
df.value = df.mask(mask, 0.0).value

这使得 df 为

          code       mapper       version  country  range    month              value
1       ABC321       ABC          Alpha     USA     High   2021-10              0.0
6       ABC321       ABC          Alpha     USA     High   2021-11              1.0
2       ABC321       PQS          Beta      IND     LOW    2021-10              0.0
3       ABC321       TRR          Delta     MEX     LOW    2021-10              1.0
4       ABC321       TRR          Delta     MEX     LOW    2021-11              3.0

现在我想将更新为“0”的掩码值“8”添加到下个月,

expected_output =  code       mapper       version  country  range    month              value
1       ABC321       ABC          Alpha     USA     High   2021-10              0.0
6       ABC321       ABC          Alpha     USA     High   2021-11              9.0
2       ABC321       PQS          Beta      IND     LOW    2021-10              0.0
3       ABC321       TRR          Delta     MEX     LOW    2021-10              1.0
4       ABC321       TRR          Delta     MEX     LOW    2021-11              3.0


EDIT

There won't be duplicate rows

【问题讨论】:

  • 预计会有像index=6 and 7这样的重复行,只有value的区别?
  • 不会有重复行

标签: python-3.x pandas dataframe


【解决方案1】:

一个想法是将值转换为月份,因此对于上个月或下个月的匹配,仅使用 + 1- 1

df['month'] = pd.to_datetime(df['month']).dt.to_period('m')

mask = (
    (df.mapper == 'ABC')
    & (df.version == 'Alpha')
    & (df.country == 'USA')
    & (df.range == 'High')
    & (df['month'] == '2021-10')
)

mask1 = (
    (df.mapper == 'ABC')
    & (df.version == 'Alpha')
    & (df.country == 'USA')
    & (df.range == 'High')
    & (df['month'] - 1 == '2021-10')
)

df.loc[mask1, 'value'] += next(iter(df.loc[mask, 'value']), 0)
df.loc[mask, 'value'] = 0


print (df)
     code mapper version country range    month  value
1  ABC321    ABC   Alpha     USA  High  2021-10    0.0
6  ABC321    ABC   Alpha     USA  High  2021-11    9.0
2  ABC321    PQS    Beta     IND   LOW  2021-10    0.0
3  ABC321    TRR   Delta     MEX   LOW  2021-10    1.0
4  ABC321    TRR   Delta     MEX   LOW  2021-11    3.0

【讨论】:

    猜你喜欢
    • 2022-08-04
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 2018-04-27
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    相关资源
    最近更新 更多