2014-11-18 3 views
0

У меня есть dataframe строк, индексированный по имени, и один столбец, содержащей точку кортежа:Панда: вычислить перестановки серии или DataFrame

import pandas as pd 
d = {'coords': {'a': (1, 2), 'b': (3, 4), 'c': (5, 6), 'd': (7, 8)}} 
df = pd.dataframe(d) 

То, что я хотел бы сделать, это получить данные в том же образом, как если бы я побежал itertools.permutations на кортежах точечных данных, с кортежем длиной 2:

from itertools import permutations 
list(permutations([(1, 2), (3, 4), (5, 6), (7, 8)], 2)) 

[((1, 2), (3, 4)), 
((1, 2), (5, 6)), 
((1, 2), (7, 8)), 
((3, 4), (1, 2)), 
((3, 4), (5, 6)), 
((3, 4), (7, 8)), 
((5, 6), (1, 2)), 
((5, 6), (3, 4)), 
((5, 6), (7, 8)), 
((7, 8), (1, 2)), 
((7, 8), (3, 4)), 
((7, 8), (5, 6))] 

целью здесь является легкий поиск координат точки для любой комбинации из двух мест (a, b --> (1, 2), (3, 4) и т.д.), но я не знаю, как вычислить это, или я могу использовать MultiIndex t o сделайте это. Решение на основе индексов было бы идеальным, потому что я также хотел бы хранить данные (например, рассчитанный маршрут) для каждой пары местоположений.

+0

Я не уверен, если я понимаю, что быть - спросил здесь. Является ли генерация решающих здесь перестановок или больше связана с тем, что вы можете сделать что-то вроде 'df.get_coord ('a', 'b') -> (1, 2), (3, 4)', и вы думаете, что перестановки являются полезным промежуточным этапом? – Marius

+0

@marius В общих чертах, я пытаюсь определить лучший способ, которым я могу взять входную серию, и в итоге получить DataFrame, который позволяет мне сохранять и извлекать рассчитанные значения для каждой двухстрочной перестановки серии. Генерация перестановок является приятной и полезной и, безусловно, будет полезна сама по себе. – urschrei

ответ

2

Использование ФР в качестве отправной точки:

Index = list(permutations(df.index, 2)) 
new_df = pd.DataFrame({ 
     'route' : [[df.loc[Ind[0], 'coords'], df.loc[Ind[1], 'coords']] for Ind in Index] 
         }, index = Index) 

Не уверен, если это то, что вы хотите, но это дает мне это:

In [21]: new_df 
Out[21]: 
        route 
(a, b) [(1, 2), (3, 4)] 
(a, c) [(1, 2), (5, 6)] 
(a, d) [(1, 2), (7, 8)] 
(b, a) [(3, 4), (1, 2)] 
(b, c) [(3, 4), (5, 6)] 
(b, d) [(3, 4), (7, 8)] 
(c, a) [(5, 6), (1, 2)] 
(c, b) [(5, 6), (3, 4)] 
(c, d) [(5, 6), (7, 8)] 
(d, a) [(7, 8), (1, 2)] 
(d, b) [(7, 8), (3, 4)] 
(d, c) [(7, 8), (5, 6)] 
Смежные вопросы