Настройка
Если у вас есть другие типы данных, кроме str
в вашем DataFrame, вам необходимо заменить все упоминания df
на df.astype(str)
.
Использование numpy.where
и str.contains
df.assign(res=np.where(df.sum(1).str.contains('I'), 'I', '-'))
Использование понимания списка:
Понимание списков часто быстрее встроенных pandas
строковых методов:
df.assign(res=['I' if 'I' in row else '-' for row in df.values.sum(1)])
Оба производят:
col1 col2 col3 res
0 a-I - - I
1 - a-I - I
2 a-I - a-I I
3 - a-I a-I I
4 - - a-I I
5 a-I a-I - I
6 - a a -
7 a a - -
Задержка
df = pd.concat([df]*5000)
%timeit ['I' if 'I' in row else '-' for row in df.values.sum(1)]
9.29 ms ± 310 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit np.where(df.sum(1).str.contains('I'), 'I', '-')
69.4 ms ± 2.17 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit df.sum(1).str.contains('I').map({False:'-',True:'I'})
83 ms ± 12.5 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)