如何找到符合pandas条件的多列索引

时间:2019-11-04 06:33:59

标签: pandas

对于给定的数据集: 输入:

d = pd.DataFrame({'option1': ['2', '3', '1', '1'], 'option2': ['3', '0', '1', '0'], 'option3': ['1', '1', '0', '0']})

我想创建一个新列,称为“ occur”,该列符合特定条件 输出应包含新列:'occur': ['2', '1', '0', '0']

创建'occur'的

条件是找到数字> 2的第一个索引: 1)假设对于第1行:option2列中的3> 2,并且其索引位于第2位,因此第1行的“出现”将显示2。 2)对于第二行,选项1> 2,因此“出现”显示为1。

1 个答案:

答案 0 :(得分:0)

首先将列转换为整数,按条件>2比较,并按numpy.argmax获取第一个True的位置,但随后必须测试每行是否至少有一个Truenumpy.where设为集合0,因为如果不存在,则返回第一行:每行True

d = {'option1': ['2', '3', '1', '1'], 
     'option2': ['3', '0', '1', '0'], 
     'option3': ['1', '1', '0', '0']}
df = pd.DataFrame(d)

m = df.astype(int) > 2
df['occur'] = np.where(m.any(axis=1), np.argmax(m.values, axis=1) + 1, 0)
print (df)

  option1 option2 option3  occur
0       2       3       1      2
1       3       0       1      1
2       1       1       0      0
3       1       0       0      0

具有列名称的熊猫解决方案与DataFrame.idxmax类似:

m = df.astype(int) > 2
df['occur'] = np.where(m.any(axis=1), m.idxmax(axis=1), 'not exist')
print (df)
  option1 option2 option3      occur
0       2       3       1    option2
1       3       0       1    option1
2       1       1       0  not exist
3       1       0       0  not exist

编辑:解决方案类似,仅通过DataFrame.iloc来选择所有行,而不先选择:

d = {'Name': ['a', 'b', 'c', 'd'], 
     'option1': ['2', '3', '1', '1'], 
     'option2': ['3', '0', '1', '0'], 
     'option3': ['1', '1', '0', '0']} 
df = pd.DataFrame(d)
print (df)
  Name option1 option2 option3
0    a       2       3       1
1    b       3       0       1
2    c       1       1       0
3    d       1       0       0

m = df.iloc[:, 1:].astype(int) > 2
df['occur'] = np.where(m.any(axis=1), np.argmax(m.values, axis=1) + 1, 0)
print (df)
  Name option1 option2 option3  occur
0    a       2       3       1      2
1    b       3       0       1      1
2    c       1       1       0      0
3    d       1       0       0      0