Получение индексов столбцов, удовлетворяющих нескольким условиям, в новом столбце с помощью pandas

#python #pandas #dataframe

#питон #панды #фрейм данных #python #pandas

Вопрос:

Со следующим фреймом данных в качестве примера :

 df = pd.DataFrame({'Sample':['X', 'Y', 'Z'], 'Base':[2, 10, 3], 'A':[0,5,100], 'C':[0,10,7]})
  

Я хотел бы добавить новый столбец, вызываемый df["indices"] с индексами столбцов df["A"] и / или df["C"] при условии, что они удовлетворяют 2 условиям:

  1. Должно быть больше 5
  2. df["A"]/df["Base"] или df["C"]/df["Base"] должно быть больше или равно 1

Результирующий фрейм данных будет иметь вид:

 df = pd.DataFrame({'Sample':['X', 'Y', 'Z'], 'Base':[2, 20, 3], 'A':[0,6,100], 'C':[0,10,7], 'indices': ['','C','A,C']})
  

Я могу получить значения True или False для моего первого условия с df[['A','C']] > 5 помощью, но я не могу заставить его работать с моим условием 2, которое основано на другом столбце в моем фрейме данных. Получение индексов, в которых я получаю True в новом столбце, — это еще одна история. Я представляю себе что-то с помощью apply и get_loc или index, но я не могу заставить это работать, как бы я ни старался.

Ответ №1:

Давайте создадим логическую маску, удовлетворяющую двум заданным условиям, затем используем DataFrame.dot эту маску для получения индексов:

 m = df[['A', 'C']].gt(5) amp; df[['A', 'C']].div(df['Base'], axis=0).ge(1)
df['indices'] = m.dot(m.columns   ',').str.rstrip(',')
  

   Sample  Base    A   C indices
0      X     2    0   0        
1      Y    10    5  10       C
2      Z     3  100   7     A,C
  

Ответ №2:

Вы можете использовать df.loc для присвоения значений обратно столбцу при выполнении любого количества условий. Простым подходом было бы иметь 3 из них, каждый с вашими желаемыми условиями. Вы также, вероятно, могли бы объединиться в цепочку np.where , чтобы добиться того же, если хотите.

 import pandas as pd

df = pd.DataFrame({'Sample':['X', 'Y', 'Z'], 
                   'Base':[2, 10, 3], 
                   'A':[0,5,100], 
                   'C':[0,10,7]})

df.loc[(df['A'] / df['Base'] >=1) amp; (df['C'] / df['Base'] >=1), 'indicies'] = 'A,C'
df.loc[(df['A'] / df['Base'] >=1) amp; (df['C'] / df['Base'] <1), 'indicies'] = 'A'
df.loc[(df['A'] / df['Base'] <1) amp; (df['C'] / df['Base'] >=1), 'indicies'] = 'C'
  

Вывод

    Sample   Base      A     C   indicies
0       X      2      0     0       NaN
1       Y     10      5    10         C
2       Z      3    100     7       A,C