Home > Software design >  Apply changes to dataframes in a dict thanks to a for loop: how to do it?
Apply changes to dataframes in a dict thanks to a for loop: how to do it?

Time:03-16

I can't apply the alterations I make to dataframes inside a dictionary. The changes are done with a for loop.

The problem is that although the loop works because the single iterated df makes the changes, they do not apply to the dictionary they are in. The end goal is to create a merge of all the dataframes since they come from different excel sheets and sheets. Here the code:

  1. Import the two excel files, assigning None to the Sheet_Name parameter in order to import all the sheets of the document into a dict. I have 8 sheet in EEG excel file and 5 in SC file

    import numpy as np
    impody pandas as np
    eeg = pd.read_excel("path_file", sheet_name = None)
    sc = pd.read_excel("path_file" sheet_name = None)
    
  2. Merges the first dictionary with the second one with the update method. Now the EEG dict contains both EEG and SC. So now I have a dict with 13 df inside

    eeg.update(sc)
    
  3. The loop for is needed in order to carry out some modifications inside the single df. reset the index to a specific column (common on all df), change its name, add a prefix on the variable that corresponds to the key of the df and lastly change the 0 with nan.

    for key, df in eeg.items():
    df.set_index(('Unnamed: 0'), inplace = True)
    df.index.rename(('Sbj'), inplace = True)
    df = df.add_prefix( key   '_')
    df.replace (0, np.nan, inplace = True)
    

Although the loop is set on the dictionary items and the single iterated dataframe works, I don't see the changes on the dictionary df's and therefore can't proceed to extract them into a list, then merge.

As you can see in the fig.1 the single df in the for loop is good!

but when I go to the df in dict, they still result as before.

CodePudding user response:

You need to map your modified dataframe back into your dictionary:

for key, df in eeg.items():
   df.set_index(('Unnamed: 0'), inplace = True)
   df.index.rename(('Sbj'), inplace = True)
   df = df.add_prefix( key   '_')
   df.replace (0, np.nan, inplace = True)
   eeg[key] = df #map df back into eeg

What you probably want is:

# merge the dataframes in your dictionary into one
df1 = pd.DataFrame()
for key, df in eeg.items():
    df1 = pd.concat([df1,df])

# apply index-changes to the merged dataframe
df1.set_index(('Unnamed: 0'), inplace = True)
df1.index.rename(('Sbj'), inplace = True)
df1 = df1.add_prefix( key   '_')
df1.replace (0, np.nan, inplace = True)

  • Related