对于给定的数据集: 输入:
d = pd.DataFrame({'option1': ['2', '3', '1', '1'], 'option2': ['3', '0', '1', '0'], 'option3': ['1', '1', '0', '0']})
我想创建一个新列,称为“ occur”,该列符合特定条件
输出应包含新列:'occur': ['2', '1', '0', '0']
条件是找到数字> 2的第一个索引: 1)假设对于第1行:option2列中的3> 2,并且其索引位于第2位,因此第1行的“出现”将显示2。 2)对于第二行,选项1> 2,因此“出现”显示为1。
答案 0 :(得分:0)
首先将列转换为整数,按条件>2
比较,并按numpy.argmax
获取第一个True
的位置,但随后必须测试每行是否至少有一个True
由numpy.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