Перестановка и комбинации в Python Pandas - PullRequest
0 голосов
/ 03 июля 2018

Я хотел бы найти наиболее оптимизированный способ поиска в Pandas DataFrame

Например

Я хотел бы найти значение

aaa = 9 in the dataframe df

DF

  index Column  value
   1     aaa      1
   2     aaa      3
   3     aaa      5
   4     aaa     -3 
   5     aaa      3
   6     aaa      0

Это должно привести к следующему

Answer: Combinations of Index locations (1,2,3), (1,2,3,4,5),(1,2,3,6),(1,2,3,4,5,6), (1,3,5), (1,3,5,6) 

так как все они составляют 9

Я избегаю запускать цикл перестановок n ^ n раз для всех комбинаций. Любые короткие пути будут высоко оценены

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Адаптированный ответ jpp:

import pandas as pd
import itertools
df = pd.DataFrame([['aaa', 1],['aaa',3], ['aaa',5], ['aaa',-3], ['aaa', 3], ['aaa',0]], columns=['A', 'B'],index=[1,2,3,4,5,6])
res = [i for j in range(1,df.index.size+1) for i in itertools.combinations(df.index,j) if df.loc[i, 'B'].sum() == 9]
print res
[(1, 2, 3), (1, 3, 5), (1, 2, 3, 6), (1, 3, 5, 6), (1, 2, 3, 4, 5), (1, 2, 3, 4, 5, 6)]
0 голосов
/ 03 июля 2018

Вот метод грубой силы, использующий itertools.combinations. Вы можете оптимизировать с помощью генератора и прекратить суммирование, когда значения превысят 9.

from itertools import combinations

d = df.set_index('index')['value'].to_dict()

n = len(d)
res = [i for j in range(n) for i in combinations(d, j) if sum(map(d.get, i)) == 9]

print(res)

[(1, 2, 3), (1, 3, 5), (1, 2, 3, 6), (1, 3, 5, 6), (1, 2, 3, 4, 5)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...