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

hgc7kmma  于 11个月前  发布在  Python
关注(0)|答案(1)|浏览(112)

我有数据库,用于在任何给定日期对给定问题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”排序的,所以我们的想法是向前填充新值,向后填充旧值。如果参数丢失,只需用现有的值填充:

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

df[upd_values.columns] = upd_values

字符串
输出量:

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

老答案

old_value = pd.to_numeric(df['old_value'], errors='coerce').shift(-1)
new_value = pd.to_numeric(df['new_value'], errors='coerce')

df['estimation_hour'] = old_value.fillna(new_value).ffill().convert_dtypes()
df['status'] = df['new_value'].mask(new_value.notna()).ffill()


输出量:

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

相关问题