【问题标题】:Update date values based on duplicated values and previous ones根据重复值和以前的值更新日期值
【发布时间】:2022-01-04 19:58:31
【问题描述】:

这是我第一次在这里发帖,这是一个棘手的问题,基本上我有这张表,其中有一位患者服用了某种药物,但由于患者可以购买几盒,因此缺少某些日期一次,所以我基本上根据患者购买的盒子数量复制了这些行。这将我带到了这张桌子:

您可以看到重复的行都购买了足够两个月的药物,在这种情况下。

我需要做的是按顺序转换日期,但我只能在日期重复时这样做,所以我不会更改其他患者的原始数据。

我试过这样的for循环

for index,row in output_table_1.iterrows():
    if index == 0:
        next
    elif output_table_1.loc[index, 'Date'] == output_table_1.loc[index-1, 'Date']:
        output_table_1.at[index, 'Date']  = row['Date'] + pd.Timedelta(days=28)
    else: 
        output_table_1.at[index, 'Date']  = row['Date']

但它并没有给我我需要的东西,基本上我需要它来根据以前的信息更改数据,如下所示:

原始数据:

Date
6 2017-01-31
7 2017-01-31
8 2017-02-28
9 2017-02-28
10 2017-03-31
11 2017-03-31
12 2017-04-30
13 2017-04-30

第一个循环:

Date
6 2017-01-31
7 2017-02-31
8 2017-02-28
9 2017-02-28
10 2017-03-31
11 2017-03-31
12 2017-04-30
13 2017-04-30

第二次循环:

Date
6 2017-01-31
7 2017-02-31
8 2017-03-28
9 2017-02-28
10 2017-03-31
11 2017-03-31
12 2017-04-30
13 2017-04-30

第三次循环:

Date
6 2017-01-31
7 2017-02-31
8 2017-03-28
9 2017-04-28
10 2017-03-31
11 2017-03-31
12 2017-04-30
13 2017-04-30

最终输出:

Date
6 2017-01-31
7 2017-02-31
8 2017-03-28
9 2017-04-28
10 2017-05-31
11 2017-06-31
12 2017-07-30
13 2017-08-30

等等。

【问题讨论】:

  • 但是,“2017-02-31”是更正的日期吗?
  • 感谢您的提问。所以基本上病人买了足够两个月的药,所以我需要延长它足够的时间。正如您在表格图片中看到的那样,他每个月买了两盒,这意味着他已经够用一年了,这就是我所需要的。基本上他需要在桌子上,用那种特殊的药物治疗 12 个月。该表还有其他患者。编辑:语法

标签: python pandas dataframe date for-loop


【解决方案1】:

如果您仍在寻找解决方案,您可以尝试以下方法:

def adjust(ser):
    if (ser == ser.shift()).any():
        one_month = pd.offsets.MonthEnd()
        last_month = ser.iat[0]
        for i, month in ser.iloc[1:].items():
            if month <= last_month:
                ser.at[i] = last_month + one_month
            last_month = ser.at[i]
    return ser

df.Date = df.groupby(["Pt", "Drg name"]).Date.transform(adjust)

假设:

  • 您的所有日期都是月末日期(在示例中看起来像这样)。
  • 您的示例不具有代表性,因为在多个日期系列中可能存在“间隙”:请参阅下面我示例中的最后一组。如果这不是必需的,那么还有一个更简单的解决方案。

我添加了条件if (ser == ser.shift()).any() 以避免不必要的工作。如果您必须调整大多数组,那么最好将其删除。

结果

df = 
      Pt       Date Drg name
0   Pt A 2017-01-31    Drg A
1   Pt A 2017-02-28    Drg A
2   Pt A 2017-03-31    Drg A
3   Pt A 2017-04-30    Drg A
4   Pt A 2017-05-31    Drg A
5   Pt A 2017-06-30    Drg A
6   Pt A 2017-01-31    Drg B
7   Pt A 2017-01-31    Drg B
8   Pt A 2017-02-28    Drg B
9   Pt A 2017-02-28    Drg B
10  Pt A 2017-03-31    Drg B
11  Pt A 2017-03-31    Drg B
12  Pt A 2017-04-30    Drg B
13  Pt A 2017-04-30    Drg B
14  Pt B 2020-11-30    Drg B
15  Pt B 2020-11-30    Drg B
16  Pt B 2021-02-28    Drg B
17  Pt B 2021-02-28    Drg B

      Pt       Date Drg name
0   Pt A 2017-01-31    Drg A
1   Pt A 2017-02-28    Drg A
2   Pt A 2017-03-31    Drg A
3   Pt A 2017-04-30    Drg A
4   Pt A 2017-05-31    Drg A
5   Pt A 2017-06-30    Drg A
6   Pt A 2017-01-31    Drg B
7   Pt A 2017-02-28    Drg B
8   Pt A 2017-03-31    Drg B
9   Pt A 2017-04-30    Drg B
10  Pt A 2017-05-31    Drg B
11  Pt A 2017-06-30    Drg B
12  Pt A 2017-07-31    Drg B
13  Pt A 2017-08-31    Drg B
14  Pt B 2020-11-30    Drg B
15  Pt B 2020-12-31    Drg B
16  Pt B 2021-02-28    Drg B
17  Pt B 2021-03-31    Drg B

【讨论】:

  • 非常感谢!这解决了甚至使解决方案更高效!你是救生员!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
  • 2014-10-27
相关资源
最近更新 更多