Получить имя столбца на основе условия в пандах
У меня есть фрейм данных, как показано ниже:
Я 9X_python-3.x хочу получить имя столбца, если столбец 9X_pythonic определенной строки, если он содержит 1 9X_python в этом столбце.
например
For Row 1: Blanks, For Row 2: Manufacturing, For Row 3: Manufacturing, For Row 4: Manufacturing, For Row 5: Social, Finance, Analytics, Advertising,
Сейчас я могу получить 9X_python-3 только полную строку:
primary_sectors = lambda primary_sector: sectors[ sectors["category_list"] == primary_sector ]
Пожалуйста, помогите 9X_machine-learning мне получить имя столбца в приведенном выше 9X_pythonista фрейме данных.
Я пробовал этот код:
primary_sectors("3D").filter(items=["0"])
Он дает 9X_py3 мне вывод как 1
, но мне нужен вывод как Manufacturing
- любезно делитесь данными, а не ...
Ответ #1
Ответ на вопрос: Получить имя столбца на основе условия в пандах
Используйте DataFrame.dot
:
df1 = df.dot(df.columns)
Если в строке несколько 1
:
df2 = df.dot(df.columns + ';').str.rstrip(';')
9X_python-shell
Ответ #2
Ответ на вопрос: Получить имя столбца на основе условия в пандах
Во-первых
Ваш вопрос очень неоднозначен, и я рекомендую 9X_machine-learning прочитать этот link в комментарии @ sammywemmy. Если 9X_pythonic я правильно понимаю вашу проблему ... сначала 9X_pd поговорим об этой маске:
df.columns[ (df == 1) # mask .any(axis=0) # mask ]
Что происходит? Давайте 9X_pythonic начнем двигаться дальше, начиная с df.columns[**HERE**]
:
(df == 1)
создает логическую маску дляdf
с помощьюTrue
/False
(1
/0
).any()
согласно docs:
«Возвращает 9X_pythonista False, если в серии или на оси Dataframe 9X_python нет хотя бы одного элемента, который имеет 9X_pythonic значение True или эквивалент».
Это дает нам 9X_python-3 удобный Series
, с помощью которого можно замаскировать 9X_py3k имена столбцов.
Мы будем использовать этот пример для автоматизации вашего решения ниже
Далее:
Автоматизируйте получение 9X_py3 вывода ( ,[
1
. Хотя 9X_pythonicэто будет медленнее для больших наборов 9X_python-interpreterданных, оно должно помочь:
import pandas as pd data = {'foo':[0,0,0,0], 'bar':[0, 1, 0, 0], 'baz':[0,0,0,0], 'spam':[0,1,0,1]} df = pd.DataFrame(data, index=['a','b','c','d']) print(df) foo bar baz spam a 0 0 0 0 b 0 1 0 1 c 0 0 0 0 d 0 0 0 1
# group our df by index and creates a dict with lists of df's as values df_dict = dict( list( df.groupby(df.index) ) )
Следующим шагом 9X_py является цикл for
, который выполняет итерацию 9X_py3k содержимого каждого df в df_dict
, проверяет их 9X_pythonista с помощью маски, созданной нами ранее, и 9X_pythonic печатает предполагаемые результаты:
for k, v in df_dict.items(): # k: name of index, v: is a df check = v.columns[(v == 1).any()] if len(check) > 0: print((k, check.to_list()))
('b', ['bar', 'spam']) ('d', ['spam'])
Боковое примечание:
Вы видите, как 9X_python-3 я создал образцы данных, которые можно легко 9X_py3k воспроизвести? В будущем, пожалуйста, попробуйте 9X_pandas задавать вопросы с опубликованными образцами 9X_python-shell данных, которые можно воспроизвести. Это 9X_pandas поможет вам лучше понять вашу проблему, и 9X_pythonic нам будет легче на нее ответить.
- Я просто обновил его для правильного вывода. Пожалуйста. Если я решил вопрос, отметьте его как от ...
Ответ #3
Ответ на вопрос: Получить имя столбца на основе условия в пандах
Получение названия столбца делится на 2 9X_machine-learning части.
Если вы хотите указать новое имя столбца, тогда 9X_python3 условие должно быть уникальным, потому что 9X_python3 оно будет давать только одно имя столбца 9X_py3 для каждой строки.
data = {'foo':[0,0,3,0], 'bar':[0, 5, 0, 0], 'baz':[0,0,2,0], 'spam':[0,1,0,1]} df = pd.DataFrame(data) df=df.replace(0,np.nan) df foo bar baz spam 0 NaN NaN NaN NaN 1 NaN 5.0 NaN 1.0 2 3.0 NaN 2.0 NaN 3 NaN NaN NaN 1.0
Если вы искали минимум 9X_pythonic или максимум
max= df.idxmax(1) min = df.idxmin(1) out= df.assign(max=max , min=min) out foo bar baz spam max min 0 NaN NaN NaN NaN NaN NaN 1 NaN 5.0 NaN 1.0 bar spam 2 3.0 NaN 2.0 NaN foo baz 3 NaN NaN NaN 1.0 spam spam
Второй случай. Если ваше условие 9X_py3k выполняется в нескольких столбцах, например, вы 9X_pythonic ищете столбцы, содержащие 1, и ищете список, потому 9X_pd что его невозможно настроить в том же фрейме 9X_py данных.
str_con= df.astype(str).apply(lambda x:x.str.contains('1.0',case=False, na=False)).any() df.column[str_con] #output Index(['spam'], dtype='object') #only spam contains 1
Или вы ищете числовые столбцы условий, содержащие 9X_pythonic значение больше 1
num_con = df.apply(lambda x:x>1.0).any() df.columns[num_con] #output Index(['foo', 'bar', 'baz'], dtype='object') #these col has higher value than 1
Удачного обучения
-
1
-
1
-
2
-
2
-
1
-
1
-
2
-
7
-
4
-
1
-
1
-
3
-
4
-
2
-
2
-
9
-
5
-
1
-
3
-
1
-
1
-
3
-
1
-
2
-
2
-
4
-
6
-
2
-
2
-
4
-
3
-
16
-
9
-
1
-
2
-
3
-
2
-
1
-
1
-
2
-
10
-
2
-
1
-
6
-
1
-
7
-
1
-
1
-
1
-
1