Mam ramkę danych

A     B      C    
True  False  False
False False  True
True  False  False
False False  False

Chcę uzyskać kolumnę o nazwie „wynik”, która zwróci nazwę kolumny, jeśli jest prawdziwa, i nan, jeśli któraś z nich nie jest prawdziwa.

Oczekiwana kolumna

result
A
C
A  
na
1
Amit 1 kwiecień 2020, 18:55

3 odpowiedzi

Najlepsza odpowiedź

Możesz użyć Series.where aby ustawić wartość kolumny na idxmax wzdłuż drugiej osi, więc odpowiednia nazwa kolumny pierwszej True lub NaN, w zależności od wyniku df.any(1):

df['result'] = df.idxmax(1).where(df.any(1))

Lub w przypadku modelu opartego na numpy możesz zamiast tego użyć argmax:

import numpy as np

df['result'] = np.where(df.values.any(1), df.columns[df.values.argmax(1)], np.nan)

print(df)

       A      B      C result
0   True  False  False      A
1  False  False   True      C
2   True  False  False      A
3  False  False  False    NaN
4
yatu 1 kwiecień 2020, 16:03

Możesz po prostu wykonać iterację na kolumnach w odwrotnej kolejności:

for col in reversed(df.columns):
    df.loc[df[col],'result'] = col

To daje:

       A      B      C result
0   True  False  False      A
1  False  False   True      C
2   True  False  False      A
3  False  False  False    NaN
1
Serge Ballesta 1 kwiecień 2020, 16:02

IIUC dot

df.dot(df.columns)
0    A
1    C
2    A
3     
dtype: object
0
BENY 1 kwiecień 2020, 16:08