NWWPA
NWWPA

Reputation: 59

pandas: while loop to simultaneously advance through multiple lists and call functions

I want my code to:

Here it is:

import pandas as pd

#creates source_df
file = "yes-no-true-false.csv"
data = pd.read_csv(file)
source_df = pd.DataFrame(data)

#creates destination_df
blanklist = []
destination_df = pd.DataFrame(blanklist)

#create the column header lists for comparison in the while loop
columns = source_df.head(0)
possible_columns = ['yes/no','true/false']

#establish the functions list and define the functions to replace column values
fix_functions_list = ['yes_no_fix()','true_false_fix()']

def yes_no_fix():
    destination_df['yes/no'] = destination_df['yes/no fixed'].replace("No","0").replace("Yes","1")
def true_false_fix():
    destination_df['true/false'] = destination_df['true/false fixed'].replace('False', '1').replace('True', '0')


'''use the counter to call a unique function from the function list to replace the values in each column whose header is found in the "possible_columns" the list, insert the modified values in "destination_df, then advance the counter'''

counter = 0
while counter < len(possible_columns):
    if possible_columns[counter] in columns:
        destination_df.insert(counter, possible_columns[counter], source_df[possible_columns[counter]])
        fix_functions_list[counter]
        counter = counter + 1

#see if it works
print(destination_df.head(10))

When I print(destination_df), I see the unmodified column values from source_df. When I call the functions independently they work, which makes me think something is going wrong in my while loop.

Upvotes: 0

Views: 38

Answers (3)

Ravi
Ravi

Reputation: 3217

#creates source_df
file = "yes-no-true-false.csv"
data = pd.read_csv(file)
source_df = pd.DataFrame(data)

possible_columns = ['yes/no','true/false']
mapping_dict={'yes/no':{"No":"0","Yes":"1"} ,'true/false': {'False':'1','True': '0'}
old_columns=[if column not in possible_columns for column in source_df.columns]
existed_columns=[if column in possible_columns  for column in source_df.columns]
new_df=source_df[existed_columns]
for column in new_df.columns:
    new_df[column].map(mapping_dict[column])

new_df[old_columns]=source_df[old_columns]

Upvotes: 0

Ravi
Ravi

Reputation: 3217

def yes_no_fix():
    destination_df['yes/no'] = destination_df['yes/no fixed'].replace("No","0").replace("Yes","1")
def true_false_fix():
    destination_df['true/false'] = destination_df['true/false fixed'].replace('False', '1').replace('True', '0')

fix_functions_list = {0:yes_no_fix,1:true_false_fix}

and change the function calling to like below

fix_functions_list[counter]()

Upvotes: 1

fthomson
fthomson

Reputation: 789

Your issue is that you are trying to call a function that is stored in a list as a string.

fix_functions_list[cnt]

This will not actually run the function just access the string value. I would try and find another way to run these functions.

Upvotes: 1

Related Questions