对于给定的数据集:输入:
d = pd.DataFrame({'option1': ['2', '3', '1', '1'], 'option2': ['3', '0', '1', '0'], 'option3': ['1', '1', '0', '0']})
我想创建一个新列,它遵循某个条件输出应包含新列:'occur': ['2', '1', '0', '0']
创建“发生”的条件是找到数字的第一个索引,它大于2 : 1 )假设option2列中的Row1: 3大于2,它的索引是第二位,因此row1的“发生”将显示2。2)对于第二行,option1是>2,因此“发生”显示为1。
发布于 2019-11-04 06:37:49
首先将列转换为整数,通过条件>2
进行比较,并通过numpy.argmax
获取第一列的位置,但是对于set numpy.where
,如果每行至少有一个True
,则需要进行测试,因为如果不存在,每行的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
使用列名的Pandas解决方案与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
选择所有行,不带first
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
https://stackoverflow.com/questions/58688281
复制相似问题