Перестановка и комбинации в Python Pandas

1

Я хотел бы найти наиболее оптимизированный способ выполнения поиска в 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 раз для всех комбинаций. Любые короткие сокращения будут высоко оценены

  • 0
    Потенциально полезно: en.wikipedia.org/wiki/Subset_sum_problem .
  • 0
    Вы можете уточнить свой вопрос? Вы хотите найти индексы, где соответствующий столбец равен aaa И сумма значений равна 9?
Показать ещё 1 комментарий
Теги:
pandas
python-3.x

2 ответа

1
Лучший ответ

Здесь используется метод грубой силы, использующий 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)]
0

Адаптированный ответ 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
    Вместо sum(df.loc[list(i)]['B']) , df.loc[i, 'B'].sum() не будет работать? Цепная индексация, встроенные функции с помощью Pandas, преобразование списка, когда в этом нет необходимости, все дорого / неоднозначно.
  • 0
    Да, это работает, даже более понятно.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню