Я хотел бы найти наиболее оптимизированный способ выполнения поиска в Pandas DataFrame
Например
Я хотел бы найти значение
aaa = 9 in the dataframe 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 раз для всех комбинаций. Любые короткие сокращения будут высоко оценены
Здесь используется метод грубой силы, использующий 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)]
Адаптированный ответ 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)]
sum(df.loc[list(i)]['B'])
, df.loc[i, 'B'].sum()
не будет работать? Цепная индексация, встроенные функции с помощью Pandas, преобразование списка, когда в этом нет необходимости, все дорого / неоднозначно.
aaa
И сумма значений равна 9?