#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 условиям:
- Должно быть больше 5
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