创建新列,告诉值为什么没有在熊猫上选择它们?

Jac*_*ack 5 pandas

输入

df=pd.DataFrame({'Name':['JOHN','ALLEN','BOB','NIKI','CHARLIE','CHANG'],
              'Age':[35,42,63,29,47,51],
              'Salary_in_1000':[100,93,78,120,64,115],
             'FT_Team':['STEELERS','SEAHAWKS','FALCONS','FALCONS','PATRIOTS','STEELERS']})


n1=(df['Age']< 60)
n2=(df['Salary_in_1000']>=100) 
n3=(df['FT_Team'].str.startswith('S'))
Run Code Online (Sandbox Code Playgroud)

使用这些条件进行选择,它将返回 JOHN 和 CHANG。

目标

我想创建未选择数据的数据框和一个返回不期望条件的新列。例如,

* ALLEN: n1, n2
* BOB: n2,n3
* NIKI: n3
* CHANG: n2,n3
Run Code Online (Sandbox Code Playgroud)

新列名称为reason. 值是条件变量,类型是字符串。

尝试

我必须尝试每个条件并手动记录每个变量违反哪些规则。

Dat*_*ice 3

创建一个新的数据框,然后.dot在布尔值和列名称上使用矩阵。

s = pd.DataFrame({'n1' : n1, 'n2' : n2, 'n3' : n3})

df['reason'] = s.eq(False).dot(s.columns +',').str.rstrip(',')

print(df)
      Name  Age  Salary_in_1000   FT_Team    reason
0     JOHN   35             100  STEELERS          
1    ALLEN   42              93  SEAHAWKS        n2
2      BOB   63              78   FALCONS  n1,n2,n3
3     NIKI   29             120   FALCONS        n3
4  CHARLIE   47              64  PATRIOTS     n2,n3
5    CHANG   51             115  STEELERS       
Run Code Online (Sandbox Code Playgroud)