2016-05-04 1 views
1

Je me donne une liste de tuples de la forme suivante:Un moyen de créer une colonne de tuples à partir d'une colonne de flottants dans les pandas?

ls = [(14, 6, 1.5), (14, 7, 1.5), (14, 8, 1.5), (14, 9, 1.5), (14, 10, 1.5), (14, 11, 1.5), (14, 12, 1.5), ..., (14, 13, 1.5), (14, 14, 1.5), (14, 15, 1.5)] 

Il y a une trame de données de pandas géants avec l'une des colonnes data['ind'] étant des nombres entiers correspondant aux indices de la liste ci-dessus. Maintenant, je voudrais créer une nouvelle colonne, qui contient le tuple correspondant à l'entrée des colonnes d'index pour la même ligne. Je suis en train de faire de cette façon:

data['ls'] = data['ind'].apply(lambda x: ls[x]) 

Mais je reçois une erreur suivant:

ValueError: setting an array element with a sequence. 

Y at-il moyen de contourner cette erreur? Le code fonctionne parfaitement si la liste contient des flotteurs ou des entiers au lieu de tuples ...

Répondre

2

Je voudrais tout d'abord créer un Series de votre liste de tuples:

LS = pd.Series(ls) 

puis appelez map:

data['ls'] = data['ind'].map(LS) 

en utilisant un échantillon de votre liste:

ls = [(14, 6, 1.5), (14, 7, 1.5), (14, 8, 1.5), (14, 9, 1.5), (14, 10, 1.5), (14, 11, 1.5), (14, 12, 1.5)] 

une nd ceci:

data = pd.DataFrame({'ind':[0,2,3]}) 

effectuer la recherche conduit à:

In [10]: LS = pd.Series(ls) 

In [11]: LS 
Out[11]: 
0  (14, 6, 1.5) 
1  (14, 7, 1.5) 
2  (14, 8, 1.5) 
3  (14, 9, 1.5) 
4 (14, 10, 1.5) 
5 (14, 11, 1.5) 
6 (14, 12, 1.5) 
dtype: object 

In [12]: data['ls'] = data['ind'].map(LS) 

In [13]: data 
Out[13]: 
    ind   ls 
0 0 (14, 6, 1.5) 
1 2 (14, 8, 1.5) 
2 3 (14, 9, 1.5) 
1

Vous pouvez créer une trame de données à partir ls et fusionner vos données.

data.merge(pd.DataFrame(ls, columns['ls']), left_on='ind', right_index=True)