Search code examples
pythonlistfor-loopzip

Python - Create multiple lists and zip


I am looking to produce multiple lists based on the same function which randomises data based on a list. I want to be able to easily change how many of these new lists I want to have and then combine. The code which creates each list is the following:

    """ 
    """
    R_ensemble=[]
    for i in range(0,len(R)):
        if R[i]==0:
            R_ensemble.append(0)
        else:
            R_ensemble.append(np.random.normal(loc=R[i],scale=R[i]/4,size=None)) 
    return R_ensemble

This perturbs each value from the list based on a normal distribution.

To combine them is fine when I just want a handful of lists:

    """
    """
    ensemble_form_1,ensemble_form_2,ensemble_form_3 = [],[],[]
    
    ensemble_form_1 = normal_transform(R)
    ensemble_form_2 = normal_transform(R)
    ensemble_form_3 = normal_transform(R)

    zipped_ensemble = list(zip(ensemble_form_1,ensemble_form_2,ensemble_form_3))
    df_ensemble = pd.DataFrame(zipped_ensemble, columns = ['Ensemble_1', 'Ensemble_2','Ensemble_3'])
    
    return ensemble_form_1, ensemble_form_2, ensemble_form_3

How could I repeat the same randomisation process to create a fixed number of lists (say 50 or 100), and then combine them into a table? Is there an easy way to do this with a for loop, or any other method? I'd need to be able to pick out each new list/column individually, as I would be combining the results in some way.

Any help would be greatly appreciated.


Solution

  • You can construct multiple lists and a table like this:

    import pandas as pd
    import numpy as np
    
    # Your function for creating the individual lists
    def normal_transform(R):
        R_ensemble=[]
        for i in range(0,len(R)):
            if R[i]==0:
                R_ensemble.append(0)
            else:
                R_ensemble.append(np.random.normal(loc=R[i],scale=R[i]/4,size=None))
        return R_ensemble
    
    # Construction of multiple lists and the dataframe
    NUM_LISTS = 50
    R = list(range(100))
    
    data = dict()
    for i in range(NUM_LISTS):
        data['Ensemble_' + str(i)] = normal_transform(R)
    df_ensemble = pd.DataFrame(data)
    

    You can access the individual lists/ columns like this:

    df_ensemble['Ensemble_42']
    df_ensemble[df_ensemble.columns[42]]