Получить имя столбца на основе условия в пандах

У меня есть фрейм данных, как показано ниже: 9X_Получить имя столбца на основе условия в пандах_python

Я 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

4
1

  • любезно делитесь данными, а не ...
3
Общее количество ответов: 3

Ответ #1

Ответ на вопрос: Получить имя столбца на основе условия в пандах

Используйте DataFrame.dot:

df1 = df.dot(df.columns)

Если в строке несколько 1:

df2 = df.dot(df.columns + ';').str.rstrip(';')

9X_python-shell

12
0

Ответ #2

Ответ на вопрос: Получить имя столбца на основе условия в пандах

Во-первых

Ваш вопрос очень неоднозначен, и я рекомендую 9X_machine-learning прочитать этот link в комментарии @ sammywemmy. Если 9X_pythonic я правильно понимаю вашу проблему ... сначала 9X_pd поговорим об этой маске:

df.columns[      
    (df == 1)        # mask 
    .any(axis=0)     # mask
]

Что происходит? Давайте 9X_pythonic начнем двигаться дальше, начиная с df.columns[**HERE**]:

  1. (df == 1) создает логическую маску для df с помощью True / False (1 / 0)
  2. .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 нам будет легче на нее ответить.

4
1

  • Я просто обновил его для правильного вывода. Пожалуйста. Если я решил вопрос, отметьте его как от ...

Ответ #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
0