Je crée donc une série de mappages de colonnes, je peux le faire manuellement comme ceci

#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}]

La fonction produit un mappage d'une valeur et de sa colonne. Génial, maintenant je veux rendre cela plus général.

Actuellement, si je devais mapper 2 colonnes par exemple, j'exécute ce qui suit:

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'}]

Fonctionne aussi bien mais pas idéal si j'ai beaucoup de colonnes. Ma question est de savoir comment rendre la première fonction valide pour plus d'une colonne?

Mon principal problème est que la ligne for (f,b) in zip(num_map, color_map):, je ne sais pas comment définir dynamiquement (f, b ..) pour correspondre au nombre de _maps que j'ai dans zip

0
Zizi96 25 févr. 2021 à 03:18

2 réponses

Meilleure réponse

Il vous suffit de les accepter dans un tuple. La façon pythonique de créer une quantité arbitraire de variables est avec une séquence. zip renvoie déjà une liste pour vous.

a = [1, 2, 3]
b = [True, False, False]
c = ['x', 'y', 'z']
abc = [a, b, c]

for several in zip(*abc):
    print(several)

Production:

(1, True, 'x')
(2, False, 'y')
(3, False, 'z')

Par la suite, vous pouvez utiliser len (plusieurs) comme valeur de contrôle pour travailler avec ces éléments. Si vous souhaitez utiliser le premier élément comme clé et le reste comme valeur:

diction[several[0]] = lsit(several[1:])

Si vous voulez entrer chaque élément comme clé, avec les autres comme valeurs, parcourez simplement several, en utilisant l'élément indiqué comme clé, et les autres comme valeur. Si vous ne savez pas comment faire cela, recherchez slice notation ou comment supprimer un élément d'une séquence.

1
Prune 25 févr. 2021 à 00:27

Une fois que vous avez votre dataframe ensemble, vous pouvez utiliser la méthode to_dict pour obtenir le même résultat:

>>> print(df)
   Number  Color  Score
0       1    red    255
1       2  white    256
2       3  black    257

# Select columns, then call `to_dict`
>>> color_num_records = df[["Number", "Color"]].to_dict("records")
>>> print(color_num_records)
[{'Number': 1, 'Color': 'red'}, {'Number': 2, 'Color': 'white'}, {'Number': 3, 'Color': 'black'}]
1
Cameron Riddell 25 févr. 2021 à 00:36