So I’m creating a series of column mappings, I can do this manually like so
#Produces a list of dictionaries
def create_seed_dict(column, dataset):
seed_col_vals = dataset[column].values.tolist()
seed_col_keys =[column] * (len(seed_col_vals))
seed_col_map = list(zip(seed_col_keys, seed_col_vals))
seed_dict = []
for k,v in seed_col_map:
diction = {}
diction[k] = v
seed_dict.append(diction)
return seed_dict, seed_col_map
#Create dummy dataframe
num = [1, 2, 3]
color = ['red', 'white', 'black']
value = [255, 256, 257]
dict = {'Number': num, 'Color': color, 'Score': value}
df = pd.DataFrame(dict)
Num_seed_Dict,Num_map = create_seed_dict('Number', df)
print(Num_seed_Dict)
-----------------------------
Out[1]: [{'Number': 1}, {'Number': 2}, {'Number': 3}]
The function produces a mapping of a value and its column. Great, now I want to make this more general.
Currently, if I needed to map 2 columns for example I run the following:
num_vals = df['Number'].values.tolist()
num_keys =['Number'] * (len(num_vals))
num_map = list(zip(num_keys, num_vals))
numDict = []
for k,v in num_map:
diction = {}
diction[k] = v
numDict.append(diction)
color_vals = df['Color'].values.tolist()
color_keys =['Color'] * (len(color_vals))
color_map = list(zip(color_keys, color_vals))
colorDict = []
for k,v in num_map:
diction = {}
diction[k] = v
colorDict.append(diction)
colorNum_Dict = []
for (f,b) in zip(num_map, color_map):
diction = {}
diction[f[0]] = f[1]
diction[b[0]] = b[1]
colorNum_Dict.append(diction)
print(colorNum_Dict)
-----------------------------
[{'Number': 1, 'Color': 'red'}, {'Number': 2, 'Color': 'white'}, {'Number': 3, 'Color': 'black'}]
Works as well but not ideal if I have a lot of columns. My question is how do I make the first function valid for more than 1 column?
My main issue is that the for (f,b) in zip(num_map, color_map):
line, I dont know how to dynamically define (f,b..) to match the number of _maps
I have within zip
Advertisement
Answer
You just have to accept them in a tuple. The Pythonic way you create an arbitrary quantity of variables is with a sequence. zip
already returns a list for you.
a = [1, 2, 3]
b = [True, False, False]
c = ['x', 'y', 'z']
abc = [a, b, c]
for several in zip(*abc):
print(several)
Output:
(1, True, 'x')
(2, False, 'y')
(3, False, 'z')
Thereafter, you can use len(several) as the controlling value to work with those items. If what you want is to use the first element as a key, and the rest as the value:
diction[several[0]] = lsit(several[1:])
If you want to enter each element as a key, with the others as values, just iterate through several
, using the indicated element as the key, and the others as the value. If you’re unclear how to do that, look up slice notation
, or how to remove one element from a sequence.