2

I have a df where I have several columns, that, based on the value (1-6) in these columns, I want to assign a value (0-1) to its corresponding column. I can do it on a column by column basis but would like to make it a single function. Below is some example code:

import pandas as pd df = pd.DataFrame({'col1': [1,3,6,3,5,2], 'col2': [4,5,6,6,1,3], 'col3': [3,6,5,1,1,6], 'colA': [0,0,0,0,0,0], 'colB': [0,0,0,0,0,0], 'colC': [0,0,0,0,0,0]}) 

(col1 corresponds with colA, col2 with colB, col3 with colC)

This code works on a column by column basis:

df.loc[(df.col1 != 1) & (df.col1 < 6), 'colA'] = (df['colA']+ 1) 

But I would like to be able to have a list of columns, so to speak, and have it correspond with another. Something like this, (but that actually works):

m = df['col1' : 'col3'] != 1 & df['col1' : 'col3'] < 6 df.loc[m, 'colA' : 'colC'] += 1 

Thank You!

2 Answers 2

2

Idea is filter both DataFrames by DataFrame.loc, then filter columns by mask and rename columns by another df2 and last use DataFrame.add only for df.columns:

df1 = df.loc[:, 'col1' : 'col3'] df2 = df.loc[:, 'colA' : 'colC'] d = dict(zip(df1.columns,df2.columns)) df1 = ((df1 != 1) & (df1 < 6)).rename(columns=d) df[df2.columns] = df[df2.columns].add(df1) print (df) col1 col2 col3 colA colB colC 0 1 4 3 0 1 1 1 3 5 6 1 1 0 2 6 6 5 0 0 1 3 3 6 1 1 0 0 4 5 1 1 1 0 0 5 2 3 6 1 1 0 
Sign up to request clarification or add additional context in comments.

Comments

0

Here's what I would do:

# split up dataframe sub_df = df.iloc[:,:3] abc = df.iloc[:,3:] # make numpy array truth table truth_table = (sub_df.to_numpy() > 1) & (sub_df.to_numpy() < 6) # redefine abc based on numpy truth table new_abc = pd.DataFrame(truth_table.astype(int), columns=['colA', 'colB', 'colC']) # join the updated dataframe subgroups new_df = pd.concat([sub_df, new_abc], axis=1) 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.