Home > database >  Updating grouped data based on date
Updating grouped data based on date

Time:07-06

I have a dataframe that looks like the following:

df = pd.DataFrame({'ID': ['1', '1', '1', '2', '2', '2'], 
                   'ID2': ['25', '29', '56', '562', '92', '170'],
                   'Origin': ['2005', '2010', '2020', '1995', '1999', '2007'],
                   'Status' : ['Done', 'Unfinished', 'Done', 'Done', 'Done', 'Unfinished']
                  })
df


 ---- ----- -------- ------------ 
| ID | ID2 | Origin |   Status   |
 ---- ----- -------- ------------ 
|  1 |  25 |   2005 | Done       |
|  1 |  29 |   2010 | Unfinished |
|  1 |  56 |   2020 | Done       |
|  2 | 562 |   1995 | Done       |
|  2 |  92 |   1999 | Done       |
|  2 | 170 |   2007 | Unfinished |
 ---- ----- -------- ------------ 


I am trying to separate into groups based on ID and update the Status column from Unfinished to Done if there is another row in the same group with a newer Done value. Essentially, if the Unfinished row is the most recent within the group, then leave the same. If Unfinished is not the most recent, change to Done.

Sample output below:


 ---- ----- -------- ------------ ---------------- 
| ID | ID2 | Origin |   Status   | Updated_Status |
 ---- ----- -------- ------------ ---------------- 
|  1 |  25 |   2005 | Done       |                |
|  1 |  29 |   2010 | Unfinished | Done           |
|  1 |  56 |   2020 | Done       |                |
|  2 | 562 |   1995 | Done       |                |
|  2 |  92 |   1999 | Done       |                |
|  2 | 170 |   2007 | Unfinished |                |
 ---- ----- -------- ------------ ---------------- 

After I finish df.groupby('ID') I know I have to try some variation of df.loc[(df['Status'] == 'Unfinished') & (df['Origin'] > today.year)] but I can't think of the proper logic or syntax to properly adjust this dataframe.

All help appreciated.

CodePudding user response:

I think you can test if shifted values per groups by enter image description here

Must add this to the dataframe,,

CodePudding user response:

It is as simple as

mask = (df.groupby('ID')['Status'].transform('last') == 'Done') & (df.Status == 'Unfinished')
df['Updated_Status'] = np.where(mask, 'Done', np.nan)

The last row in each group corresponds to the latest entry. Use that to transform for each Status. Then, use the condition for updating the status.

  • Related