Create a dictionary from a list

Question:

I’m trying to create a dictionary in Python from this output:

["'a'=df2['a']", "'b'=df2['b']", "'c'=df2['c']", "'d'=df2['d']"]

I tried with this code:

list_columns = list(df2.columns)
list_dictionary = []
for row in list_columns:
    resultado = "'"+str(row)+"'" + "=" + "df2[" + "'" + row + "'" + "]"
    list_dictionary.append(resultado)
clean_list_dictionary = ','.join(list_dictionary).replace('"','')
dictionary = dict(clean_list_dictionary)
print(dictionary) 

But I get an error:

ValueError: dictionary update sequence element #0 has length 1; 2 is required

Do you have any idea how I can make this work?

Thank you in advance!

Output dictionary should look like this:

{
    'a' : df2['a'], 
    'b' : df2['b'], 
    'c' : df2['c'], 
    'd' : df2['d']
}
Asked By: Junior P

||

Answers:

You can loop over the list,split by charater and convert to dict.

Code:

dic= {}
[dic.update(dict( [l.split('=')])) for l in ls]
dic
Answered By: R. Baraiya

Its not clear what exactly you want to achieve.

  1. If You have a pd.DataFrame() and you want to convert it to a dictionary where column names are keys and column values are dict values you should use df.to_dict(‘series’).
import pandas as pd

# Generate the dataframe
data = {'a': [1, 2, 1, 0], 'b': [2, 3, 4, 5], 'c': [10, 11, 12, 13], 'd': [21, 22, 23, 24]}
df = pd.DataFrame.from_dict(data)

# Convert to dictionary
result = df.to_dict('series')

print(result)
  1. If you have a list of strings that you need to convert to desired output than you should do it differently. What you have are strings ‘df’ while df in your dict is a variable. So you only need to extract the column names and use the variable df not the string ‘df’
import pandas as pd

# Generate the dataframe
data = {'a': [1, 2, 1, 0], 'b': [2, 3, 4, 5], 'c': [10, 11, 12, 13], 'd': [21, 22, 23, 24]}
df = pd.DataFrame.from_dict(data)

# create string list
lst = ["'a'=df2['a']", "'b'=df2['b']", "'c'=df2['c']", "'d'=df2['d']"]

# Convert to dictionary
result = {}
for item in lst:
  key = item[1]
  result[key] = df[key]

print(result)

The results are the same but in second case list of strings is created for no reason because first example can achieve the same results without it..

Answered By: Geom

I think this is exactly what you want.

data = ["'a'=df2['a']", "'b'=df2['b']", "'c'=df2['c']", "'d'=df2['d']"]
dic = {}
for d in data:
    k = d.split("=")[0]
    v = df2[d.split("=")[1].split("'")[1]]
    dic.update({k: v})
print(dic)
Answered By: JongHyeon Yeo

Method 1: Transforming your list of string for an eval later

As you have mentioned in your comment –

I would like to create a dictionary for with this format: ”’ {‘a’ : df2[‘a’], ‘b’ : df2[‘b’], ‘c’ : df2[‘c’], ‘d’ : df2[‘d’]} ”’ I will use it as global variables in an eval() function.

You can use the following to convert your input string

#dummy dataframe
df2 = pd.DataFrame([[1,2,3,4]], columns=['a','b','c','d']) #Dummy dataframe

#your list of strings
l = ["'a'=df2['a']", "'b'=df2['b']", "'c'=df2['c']", "'d'=df2['d']"]

#Solution
def dict_string(l):
  s0 = [i.split('=') for i in l]
  s1 = '{' + ', '.join([': '.join([k,v]) for k,v in s0]) + '}'
  return s1


output = dict_string(l)
print(output)
eval(output)
#String before eval
{'a': df2['a'], 'b': df2['b'], 'c': df2['c'], 'd': df2['d']}   #<----

#String after eval
{'a': 0    1
 Name: a, dtype: int64, 
'b': 0    2
 Name: b, dtype: int64, 
'c': 0    3
 Name: c, dtype: int64, 
'd': 0    4
 Name: d, dtype: int64}


Method 2: Using eval as part of your iteration of the list of strings

Here is a way to do this using list comprehensions and eval, as part of the iteration on the list of strings itself. This will give you the final output that you would get if you were to use eval on the dictionary string you are expecting.

#dummy dataframe
df2 = pd.DataFrame([[1,2,3,4]], columns=['a','b','c','d']) #Dummy dataframe

#your list of strings
l = ["'a'=df2['a']", "'b'=df2['b']", "'c'=df2['c']", "'d'=df2['d']"]

#Solution
def eval_dict(l):
  s0 = [(eval(j) for j in i.split('=')) for i in l]
  s1 = {k:v for k,v in s0}
  return s1

output = eval_dict(l)
print(output)
{'a': 0    1
 Name: a, dtype: int64, 
'b': 0    2
 Name: b, dtype: int64, 
'c': 0    3
 Name: c, dtype: int64, 
'd': 0    4
 Name: d, dtype: int64}

The output is a dict that has 4 keys, (a,b,c,d) and 4 corresponding values for columns a, b, c, d from df2 respectively.

Answered By: Akshay Sehgal
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.