numpy 基于Python Pandas DataFrame中的条件迭代行并更新列值

hgc7kmma  于 2024-01-08  发布在  Python
关注(0)|答案(1)|浏览(121)

我有数据库,用于在任何给定日期对给定问题ID所做的更改。changed_parameter中的值是进行更改的参数。
其已更改参数的旧值和新值分别在old_value new_value列中更新
| 问题ID|到期日|地位|估计小时|更改日期|变化参数|旧值|新值|
| --|--|--|--|--|--|--|--|
| 101 |2023年1月31日|关闭| 40 |2023年1月10日|地位|定义|接受|
| 101 |2023年1月31日|关闭| 40 |2023年1月15日|估计小时| 0 | 20 |
| 101 |2023年1月31日|关闭| 40 |2023年1月16日|估计小时| 20 | 30 |
| 101 |2023年1月31日|关闭| 40 |2023年1月16日|到期日|2023年1月20日|2023年1月31日|
| 101 |2023年1月31日|关闭| 40 |2023年1月20日|地位|接受|InProgress|
| 101 |2023年1月31日|关闭| 40 |2023年1月25日|估计小时| 30 | 40 |
| 101 |2023年1月31日|关闭| 40 |2023年1月30日|地位|InProgress|关闭|
| 102 |2023年2月28日|关闭| 50 |2023年1月10日|地位|定义|接受|
| 102 |2023年2月28日|关闭| 50 |2023年1月15日|估计小时| 0 | 30 |
| 102 |2023年2月28日|关闭| 50 |2023年1月20日|地位|接受|InProgress|
| 102 |2023年2月28日|关闭| 50 |2023年1月25日|估计小时| 30 | 50 |
| 102 |2023年2月28日|关闭| 50 |2023年1月30日|地位|InProgress|关闭|
因此,现在我必须根据上述数据在更改的日期创建问题ID的快照
所以我的最终表格应该是这样的
| 问题ID|到期日|地位|估计小时|更改日期|变化参数|旧值|新值|
| --|--|--|--|--|--|--|--|
| 101 |2023年1月20日|接受| 0 |2023年1月10日|地位|定义|接受|
| 101 |2023年1月20日|接受| 20 |2023年1月15日|估计小时| 0 | 20 |
| 101 |2023年1月20日|接受| 30 |2023年1月16日|估计小时| 20 | 30 |
| 101 |2023年1月31日|接受| 30 |2023年1月16日|到期日|2023年1月20日|2023年1月31日|
| 101 |2023年1月31日|InProgress| 30 |2023年1月20日|地位|接受|InProgress|
| 101 |2023年1月31日|InProgress| 40 |2023年1月25日|估计小时| 30 | 40 |
| 101 |2023年1月31日|关闭| 40 |2023年1月30日|地位|InProgress|关闭|
| 102 |2023年2月28日|接受| 0 |2023年1月10日|地位|定义|接受|
| 102 |2023年2月28日|接受| 30 |2023年1月15日|估计小时| 0 | 30 |
| 102 |2023年2月28日|InProgress| 30 |2023年1月20日|地位|接受|InProgress|
| 102 |2023年2月28日|InProgress| 50 |2023年1月25日|估计小时| 30 | 50 |
| 102 |2023年2月28日|关闭| 50 |2023年1月30日|地位|InProgress|关闭|
我已经在pandas框架中更新了上面的数据,并迭代了每一行。
在每次迭代中,我都将已更改参数的旧值更新到该问题ID的先前可用行,直到相同。新值更新到当前行,如下所示
遍历每一行都很耗时
第1次迭代
| 问题ID|到期日|地位|估计小时|更改日期|变化参数|旧值|新值|
| --|--|--|--|--|--|--|--|
| 101 |2023年1月31日|接受| 40 |2023年1月10日|地位|定义|接受|
| 101 |2023年1月31日|关闭| 40 |2023年1月15日|估计小时| 0 | 20 |
| 101 |2023年1月31日|关闭| 40 |2023年1月16日|估计小时| 20 | 30 |
| 101 |2023年1月31日|关闭| 40 |2023年1月16日|到期日|2023年1月20日|2023年1月31日|
| 101 |2023年1月31日|关闭| 40 |2023年1月20日|地位|接受|InProgress|
| 101 |2023年1月31日|关闭| 40 |2023年1月25日|估计小时| 30 | 40 |
| 101 |2023年1月31日|关闭| 40 |2023年1月30日|地位|InProgress|关闭|
| 102 |2023年2月28日|关闭| 50 |2023年1月10日|地位|定义|接受|
| 102 |2023年2月28日|关闭| 50 |2023年1月15日|估计小时| 0 | 30 |
| 102 |2023年2月28日|关闭| 50 |2023年1月20日|地位|接受|InProgress|
| 102 |2023年2月28日|关闭| 50 |2023年1月25日|估计小时| 30 | 50 |
| 102 |2023年2月28日|关闭| 50 |2023年1月30日|地位|InProgress|关闭|
第二次迭代
| 问题ID|到期日|地位|估计小时|更改日期|变化参数|旧值|新值|
| --|--|--|--|--|--|--|--|
| 101 |2023年1月31日|接受| 0 |2023年1月10日|地位|定义|接受|
| 101 |2023年1月31日|关闭| 20 |2023年1月15日|估计小时| 0 | 20 |
| 101 |2023年1月31日|关闭| 40 |2023年1月16日|估计小时| 20 | 30 |
| 101 |2023年1月31日|关闭| 40 |2023年1月16日|到期日|2023年1月20日|2023年1月31日|
| 101 |2023年1月31日|关闭| 40 |2023年1月20日|地位|接受|InProgress|
| 101 |2023年1月31日|关闭| 40 |2023年1月25日|估计小时| 30 | 40 |
| 101 |2023年1月31日|关闭| 40 |2023年1月30日|地位|InProgress|关闭|
| 102 |2023年2月28日|关闭| 50 |2023年1月10日|地位|定义|接受|

| 102 |2023年2月28日|关闭| 50 |2023年1月15日|估计小时| 0 | 30 |
| 102 |2023年2月28日|关闭| 50 |2023年1月20日|地位|接受|InProgress|
| 102 |2023年2月28日|关闭| 50 |2023年1月25日|估计小时| 30 | 50 |
| 102 |2023年2月28日|关闭| 50 |2023年1月30日|地位|InProgress|关闭|
第3次迭代
| 问题ID|到期日|地位|估计小时|更改日期|变化参数|旧值|新值|
| --|--|--|--|--|--|--|--|
| 101 |2023年1月31日|接受| 0 |2023年1月10日|地位|定义|接受|
| 101 |2023年1月31日|关闭| 20 |2023年1月15日|估计小时| 0 | 20 |
| 101 |2023年1月31日|关闭| 30 |2023年1月16日|估计小时| 20 | 30 |
| 101 |2023年1月31日|关闭| 40 |2023年1月16日|到期日|2023年1月20日|2023年1月31日|
| 101 |2023年1月31日|关闭| 40 |2023年1月20日|地位|接受|InProgress|
| 101 |2023年1月31日|关闭| 40 |2023年1月25日|估计小时| 30 | 40 |
| 101 |2023年1月31日|关闭| 40 |2023年1月30日|地位|InProgress|关闭|
| 102 |2023年2月28日|关闭| 50 |2023年1月10日|地位|定义|接受|
| 102 |2023年2月28日|关闭| 50 |2023年1月15日|估计小时| 0 | 30 |
| 102 |2023年2月28日|关闭| 50 |2023年1月20日|地位|接受|InProgress|
| 102 |2023年2月28日|关闭| 50 |2023年1月25日|估计小时| 30 | 50 |
| 102 |2023年2月28日|关闭| 50 |2023年1月30日|地位|InProgress|关闭|
第四次迭代
| 问题ID|到期日|地位|估计小时|更改日期|变化参数|旧值|新值|
| --|--|--|--|--|--|--|--|
| 101 |2023年1月20日|接受| 0 |2023年1月10日|地位|定义|接受|
| 101 |2023年1月20日|关闭| 20 |2023年1月15日|估计小时| 0 | 20 |
| 101 |2023年1月20日|关闭| 30 |2023年1月16日|估计小时| 20 | 30 |
| 101 |2023年1月31日|关闭| 40 |2023年1月16日|到期日|2023年1月20日|2023年1月31日|
| 101 |2023年1月31日|关闭| 40 |2023年1月20日|地位|接受|InProgress|
| 101 |2023年1月31日|关闭| 40 |2023年1月25日|估计小时| 30 | 40 |
| 101 |2023年1月31日|关闭| 40 |2023年1月30日|地位|InProgress|关闭|
| 102 |2023年2月28日|关闭| 50 |2023年1月10日|地位|定义|接受|
| 102 |2023年2月28日|关闭| 50 |2023年1月15日|估计小时| 0 | 30 |
| 102 |2023年2月28日|关闭| 50 |2023年1月20日|地位|接受|InProgress|
| 102 |2023年2月28日|关闭| 50 |2023年1月25日|估计小时| 30 | 50 |
| 102 |2023年2月28日|关闭| 50 |2023年1月30日|地位|InProgress|关闭|
第五次迭代
| 问题ID|到期日|地位|估计小时|更改日期|变化参数|旧值|新值|
| --|--|--|--|--|--|--|--|
| 101 |2023年1月20日|接受| 0 |2023年1月10日|地位|定义|接受|
| 101 |2023年1月20日|接受| 20 |2023年1月15日|估计小时| 0 | 20 |
| 101 |2023年1月20日|接受| 30 |2023年1月16日|估计小时| 20 | 30 |
| 101 |2023年1月31日|接受| 40 |2023年1月16日|到期日|2023年1月20日|2023年1月31日|
| 101 |2023年1月31日|InProgress| 40 |2023年1月20日|地位|接受|InProgress|
| 101 |2023年1月31日|关闭| 40 |2023年1月25日|估计小时| 30 | 40 |
| 101 |2023年1月31日|关闭| 40 |2023年1月30日|地位|InProgress|关闭|
| 102 |2023年2月28日|关闭| 50 |2023年1月10日|地位|定义|接受|
| 102 |2023年2月28日|关闭| 50 |2023年1月15日|估计小时| 0 | 30 |
| 102 |2023年2月28日|关闭| 50 |2023年1月20日|地位|接受|InProgress|
| 102 |2023年2月28日|关闭| 50 |2023年1月25日|估计小时| 30 | 50 |
| 102 |2023年2月28日|关闭| 50 |2023年1月30日|地位|InProgress|关闭|
等等。

r1wp621o

r1wp621o1#

因为你的例子不是那么简单,你需要重新塑造你的数据框,然后按Issue_Id分组,然后更新值。因为你的数据框是按“changed_date”排序的,所以我们的想法是向前填充新值,向后填充旧值。如果参数丢失,只需用现有的值填充:

  1. def update_values(df):
  2. return df['new_value'].ffill().fillna(df['old_value'].bfill())
  3. upd_values = (df.pivot_table(index=df.index, columns='changed_parameter',
  4. values=['old_value', 'new_value'], aggfunc='first')
  5. .groupby(df['Issue_Id']).apply(update_values)
  6. .droplevel('Issue_Id').fillna(df))
  7. df[upd_values.columns] = upd_values

字符串
输出量:

  1. >>> df
  2. Issue_Id Due_Date status estimation_hour changed_date changed_parameter old_value new_value
  3. 0 101 1/20/2023 Accepted 0 1/10/2023 status Defined Accepted
  4. 1 101 1/20/2023 Accepted 20 1/15/2023 estimation_hour 0 20
  5. 2 101 1/20/2023 Accepted 30 1/16/2023 estimation_hour 20 30
  6. 3 101 1/31/2023 Accepted 30 1/16/2023 Due_Date 1/20/2023 1/31/2023
  7. 4 101 1/31/2023 InProgress 30 1/20/2023 status Accepted InProgress
  8. 5 101 1/31/2023 InProgress 40 1/25/2023 estimation_hour 30 40
  9. 6 101 1/31/2023 Closed 40 1/30/2023 status InProgress Closed
  10. 7 102 2/28/2023 Accepted 0 1/10/2023 status Defined Accepted
  11. 8 102 2/28/2023 Accepted 30 1/15/2023 estimation_hour 0 30
  12. 9 102 2/28/2023 InProgress 30 1/20/2023 status Accepted InProgress
  13. 10 102 2/28/2023 InProgress 50 1/25/2023 estimation_hour 30 50
  14. 11 102 2/28/2023 Closed 50 1/30/2023 status InProgress Closed

老答案

  1. old_value = pd.to_numeric(df['old_value'], errors='coerce').shift(-1)
  2. new_value = pd.to_numeric(df['new_value'], errors='coerce')
  3. df['estimation_hour'] = old_value.fillna(new_value).ffill().convert_dtypes()
  4. df['status'] = df['new_value'].mask(new_value.notna()).ffill()


输出量:

  1. >>> df
  2. Issue_Id status estimation_hour changed_date changed_parameter old_value new_value
  3. 0 101 Accepted 0 1/10/2023 status Defined Accepted
  4. 1 101 Accepted 20 1/15/2023 estimation_hour 0 20
  5. 2 101 InProgress 20 1/20/2023 status Accepted InProgress
  6. 3 101 InProgress 40 1/25/2023 estimation_hour 20 40
  7. 4 101 Closed 40 1/30/2023 status InProgress Closed
  8. 5 102 Accepted 0 1/10/2023 status Defined Accepted
  9. 6 102 Accepted 30 1/15/2023 estimation_hour 0 30
  10. 7 102 InProgress 30 1/20/2023 status Accepted InProgress
  11. 8 102 InProgress 50 1/25/2023 estimation_hour 30 50
  12. 9 102 Closed 50 1/30/2023 status InProgress Closed

展开查看全部

相关问题