Python Forum
Change row values by other row values from same df - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: Data Science (https://python-forum.io/forum-44.html)
+--- Thread: Change row values by other row values from same df (/thread-34721.html)



Change row values by other row values from same df - JosepMaria - Aug-25-2021

I have the following dataset:

df = pd.DataFrame( {'user': {0: 1, 1: 1, 2: 1, 3: 2, 4: 2, 5: 2, 6: 2}, 
    'date': {0: '1995-09-01', 1: '1995-09-02', 2: '1995-10-03', 3: '1995-10-04', 4: '1995-10-05', 5: '1995-11-07', 6: '1995-11-08'}, 
    'x': {0: '1995-09-02', 1: '1995-09-02', 2: '1995-09-02', 3: '1995-10-05', 4: '1995-10-05', 5: '1995-10-05', 6: '1995-10-05'}, 
    'y': {0: '1995-10-03', 1: '1995-10-03', 2: '1995-10-03', 3: '1995-11-08', 4: '1995-11-08', 5: '1995-11-08', 6: '1995-11-08'}, 
    'c1': {0: '1', 1: '0', 2: '0', 3: '2', 4: '0', 5: '9', 6: '0'}, 
    'c2': {0: '1', 1: '0', 2: '0', 3: '2', 4: '0', 5: '9', 6: '0'}, 
    'c3': {0: '1', 1: '0', 2: '0', 3: '2', 4: '0', 5: '9', 6: '0'}, 
    'VTX1': {0: 1, 1: 0, 2: 0, 3: 1, 4: 0, 5: 0, 6: 0}, 
    'VTY1': {0: 0, 1: 1, 2: 0, 3: 0, 4: 0, 5: 1, 6: 0}} )
which gives me:

    user    date         x           y     c1   c2 c3  VTX1 VTY1
0   1   1995-09-01  1995-09-02  1995-10-03  1   1   1   1      0
1   1   1995-09-02  1995-09-02  1995-10-03  0   0   0   0      1
2   1   1995-10-03  1995-09-02  1995-10-03  0   0   0   0      0
3   2   1995-10-04  1995-10-05  1995-11-08  2   2   2   1      0
4   2   1995-10-05  1995-10-05  1995-11-08  0   0   0   0      0
5   2   1995-11-07  1995-10-05  1995-11-08  9   9   9   0      1
6   2   1995-11-08  1995-10-05  1995-11-08  0   0   0   0      0 
I want to replaces df[‘c1’] as follows.

- When df[‘date’]=df[‘x’],
change df[‘c1’] for the df[‘c1’] value when df[‘VTX1’]=1

In this example, for user 1, when df[‘date’]=df[‘x’] it happens to be on index 1. Here we want df['c1'] to be 1. Note that 1 is the value that user 1 has on df['c1'] when df['VTX1'] = 1.

So the end result would be:


    user    date         x           y     c1   c2 c3  VTX1 VTY1
0   1   1995-09-01  1995-09-02  1995-10-03  1   1   1     1    0
1   1   1995-09-02  1995-09-02  1995-10-03  1   0   0     0    1
2   1   1995-10-03  1995-09-02  1995-10-03  1   0   0     0    0
3   2   1995-10-04  1995-10-05  1995-11-08  2   2   2     1    0
4   2   1995-10-05  1995-10-05  1995-11-08  2   0   0     0    0
5   2   1995-11-07  1995-10-05  1995-11-08  9   9   9     0    1
6   2   1995-11-08  1995-10-05  1995-11-08  0   0   0     0    0



RE: Change row values by other row values from same df - Larz60+ - Aug-25-2021

what code have you tried so far?


RE: Change row values by other row values from same df - eddywinch82 - Aug-26-2021

Hi JosepMaria,

Here is a method, to help you get a solution, I havn't got it quite right yet, but one way, is that you can use Numpy select with conditions.
I hope this helps you.

Could someone clean up the following attempt of mine, to give JosepMaria, the answer he needs ? If that is okay ? Why are the last two Rows values of the DataFrame, not changing to 9 and 0 respectively in the 'c1' Column, when the Code is run ?

import pandas as pd
import numpy as np
 
df = pd.DataFrame( {'user': {0: 1, 1: 1, 2: 1, 3: 2, 4: 2, 5: 2, 6: 2}, 
    'date': {0: '1995-09-01', 1: '1995-09-02', 2: '1995-10-03', 3: '1995-10-04', 4: '1995-10-05', 5: '1995-11-07', 6: '1995-11-08'}, 
    'x': {0: '1995-09-02', 1: '1995-09-02', 2: '1995-09-02', 3: '1995-10-05', 4: '1995-10-05', 5: '1995-10-05', 6: '1995-10-05'}, 
    'y': {0: '1995-10-03', 1: '1995-10-03', 2: '1995-10-03', 3: '1995-11-08', 4: '1995-11-08', 5: '1995-11-08', 6: '1995-11-08'}, 
    'c1': {0: '1', 1: '0', 2: '0', 3: '2', 4: '0', 5: '9', 6: '0'}, 
    'c2': {0: '1', 1: '0', 2: '0', 3: '2', 4: '0', 5: '9', 6: '0'}, 
    'c3': {0: '1', 1: '0', 2: '0', 3: '2', 4: '0', 5: '9', 6: '0'}, 
    'VTX1': {0: 1, 1: 0, 2: 0, 3: 1, 4: 0, 5: 0, 6: 0}, 
    'VTY1': {0: 0, 1: 1, 2: 0, 3: 0, 4: 0, 5: 1, 6: 0}} )
 

df['date']= pd.to_datetime(df['date']).dt.strftime('%d-%b-%Y')
df['x']= pd.to_datetime(df['x']).dt.strftime('%d-%b-%Y')
df['y']= pd.to_datetime(df['y']).dt.strftime('%d-%b-%Y')
 
df = df.astype(str)

col         = 'c1'
conditions  = [ df['date'].str.contains('Sep|Oct') == df['x'].str.contains('Sep'), df['date'].str.contains('Oct') == df['y'].str.contains('Nov'), df['date'].str.contains('07'), df['date'].str.contains('08')]   
#conditions = [ df['date'].eq(df['x']), (df['date'].eq(df['x']) & (df['user'].str.contains('2')))]
choices     = ['1', '2', '9', '0']
     
df['c1'] = np.select(conditions, choices) 
 
df
Best Regards

Eddie Winch


RE: Change row values by other row values from same df - eddywinch82 - Aug-28-2021

Hi there,

If I replace '==' with '&' in these two lines of my Code,

The desired DataFrame Output is now achieved :-

df['date'].str.contains('Sep|Oct') == df['x'].str.contains('Sep'), df['date'].str.contains('Oct') == df['y'].str.contains('Nov'),
Best Regards

Eddie Winch