En utilisant deux séries Pandas: série 1, et série 2, je suis prêt à faire série3. Chaque valeur de series1 est une liste et chaque valeur de series2 est un index correspondant de series1.Si la valeur de la série pandas est une liste, comment obtenir une sous-liste de chaque élément?
>>> print(series1)
0 [481, 12, 11, 220, 24, 24, 645, 153, 15, 13, 6...
1 [64, 80, 79, 147, 14, 20, 56, 288, 12, 208, 26...
4 [5, 6, 152, 31, 295, 127, 711, 5, 271, 291, 11...
5 [363, 121, 727, 249, 483, 122, 241, 494, 555]
7 [112, 20, 41, 9, 104, 131, 26, 298, 65, 214, 1...
9 [129, 797, 19, 151, 448, 47, 19, 106, 299, 144...
11 [72, 35, 25, 200, 122, 5, 75, 30, 208, 24, 14,...
18 [137, 339, 71, 14, 19, 54, 61, 15, 73, 104, 43...
>>> print(series2)
0 0
1 3
4 1
5 6
7 4
9 5
11 7
18 2
Ce que j'attends:
>>> print(series3)
0 [481, 12, 11, 220, 24, 24, 645, 153, 15, 13, 6...
1 [147, 14, 20, 56, 288, 12, 208, 26...
4 [6, 152, 31, 295, 127, 711, 5, 271, 291, 11...
5 [241, 494, 555]
7 [104, 131, 26, 298, 65, 214, 1...
9 [47, 19, 106, 299, 144...
11 [30, 208, 24, 14,...
18 [71, 14, 19, 54, 61, 15, 73, 104, 43...
Ma solution 1: Du fait que la longueur de série1 et series2 sont égaux, je pourrais faire une boucle pour itérer série1 et de calculer quelque chose comme series1.ix[i][series2.ix[i]]
et faire une nouvelle série (série3) pour enregistrer le résultat.
Ma solution 2: Générer une trame de données df utilisant df = pd_concat([series1, series2])
, et faire une nouvelle colonne (opération de ligne sage à l'aide appliquer la fonction - par exemple, df [ 'series3'] = df.apply (lambda x: subList (x), axe = 1).
Cependant, je pensais au-dessus de deux solutions ne sont pas des moyens affûtés pour obtenir ce que je veux. Je vous serais reconnaissant si vous proposez des solutions plus nettes!
Qu'est-ce que D'autres types de solutions espérais-tu? Essentiellement, vous allez devoir boucler vos lignes. 'pandas' n'a pas été conçu avec des valeurs' list's en tête, donc il n'y aura pas de fonctions intégrées pour accommoder des choses comme le découpage de liste vectorisé. La solution la plus «soignée» que je pourrais trouver est 'pd.concat ([S1, S2], axis = 1) .apply (lambda x: x [0] [x [1]:], axe = 1)' (en supposant que les "colonnes" seront de simples étiquettes entières) mais ceci n'est pas plus efficace que la simple boucle for que vous mentionnez. –
En effet, regardez combien il est plus facile de travailler avec des listes Python: 'L1, L2 = S1.tolist(), S2.tolist()' alors simplement 'list (map (lambda x, y: x [y: ], L1, L2)) 'et c'est probablement aussi efficace (plus vraiment) que les opérations' pandas '. –
1. Je ne voulais pas faire de dataFrame copié pour effectuer ce calcul. J'espère que quelqu'un connaît la meilleure réponse que cela. 2. Il est un peu dangereux de convertir la série en liste dans mon cas. Une erreur de calcul pourrait être faite si les indices sont ignorés. – SUNDONG