Найдите значение на основе комбинации столбцов

#python #pandas

#питон #панды

Вопрос:

Есть ли способ найти значение на основе комбинации значений столбцов?

Пример:

 df = pd.DataFrame({  'One' : [np.random.randint(1, 10) for i in range(10)],  'Two' : [np.random.randint(1, 10) for i in range(10)],  'Three' : [np.random.randint(1, 10) for i in range(10)],  'Four' : [np.random.randint(1, 10) for i in range(10)], })  

.

 In [6]: df Out[6]:  One Two Three Four 0 8 1 7 5 1 6 3 3 3 2 4 7 5 2 3 4 2 6 9 4 1 7 1 9 5 9 8 3 8 6 4 8 4 4 7 1 9 7 1 8 4 2 6 4 9 1 3 7 7  

У меня есть следующий df, и мне интересно, какие из столбцов мне нужно будет объединить, чтобы получить номер 9. Это будет комбинация на основе столбцов, поэтому каждая строка будет выводить имя столбцов, которые были объединены, чтобы найти 9.

  • В примере строка 0 будет давать результат: ['One', 'Two']
  • строка 1: даст комбинацию 'One' и всех остальных трех. ['One', 'Two'], ['One', 'Three'], ['One', 'Four']
  • строка 2: Ложь
  • строка 3: [«Четыре»]

и так далее…

ПРИМЕЧАНИЕ: Фрейм данных должен оставаться неизменным.

Спасибо за любые будущие предложения или помощь.

Комментарии:

1. Под «объединить» вы имеете в виду «любую комбинацию столбцов в этой строке можно суммировать, чтобы получить 24»?

2. @JeffUK да, в принципе .sum() == 24

3. Является ли это какой-либо комбинацией каких-либо столбцов или это сумма ВСЕХ столбцов = 24?

4. Любая комбинация любого колума. Я изменю пример, чтобы он был немного понятнее.

Ответ №1:

Сначала получите все комбинации имен столбцов для фрейма данных, которые вы можете использовать itertools.combinations для него, затем создайте функцию, которая вычислит sum для каждой комбинации имен столбцов и сохранит такие комбинации во временном списке, если сумма sum равна требуемой сумме, наконец, вернет список комбинаций столбцов и применит эту функцию к фрейму данных, например axis=1

 import itertools cols = [j for i in [[list(col)  for col in (itertools.combinations(df.columns, i))]  for i in range(1, df.shape[1]   1)]  for j in i] def getSubArray(row, sum_=9):  result=[]  for col in cols:  if row.loc[col].sum()==sum_:  result.append(col)  return result  result = df.apply(getSubArray, axis=1)  

выход:

 0 [[One, Two]] 1 [[One, Two], [One, Three], [One, Four], [Two, Three, Four]] 2 [[One, Three], [Two, Four]] 3 [[Four]] 4 [[Four], [One, Two, Three]] 5 [[One]] 6 [] 7 [[Two], [One, Three, Four]] 8 [] 9 [] dtype: object  

Вы можете передать любое значение требуемой суммы в getSubArray из .apply вызова, например: df.apply(getSubArray, axis=1, sum_=24)

Ответ №2:

 from itertools import combinations def find_9(x, v=9):  c = combinations(x.index, 2)  columns = []  for i,j in c:  if (x[i] x[j]) == v:  columns.append([i,j])  return columns if columns else False  df.apply(lambda x: find_9(x),axis= 1)  

выход:

 0 [[One, Two]] 1 [[One, Two], [One, Three], [One, Four]] 2 [[One, Three], [Two, Four]] 3 False 4 False 5 False 6 False 7 False 8 False 9 False