Вы можете использовать np.where. Если cond
является логическим массивом, а A
и B
массивы, а затем
C = np.where(cond, A, B)
определяет С равным A
где cond
правда, и B
где cond
ложна.
import numpy as np
import pandas as pd
a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])
df['que'] = np.where((df['one'] >= df['two']) & (df['one'] <= df['three'])
, df['one'], np.nan)
дает
one two three que
0 10 1.2 4.2 10
1 15 70 0.03 NaN
2 8 5 0 NaN
Если у Вас есть больше чем одно условие, то вы могли бы использовать вместо np.select. Например, если вы хотите df['que']
равным df['two']
когда df['one'] < df['two']
, то
conditions = [
(df['one'] >= df['two']) & (df['one'] <= df['three']),
df['one'] < df['two']]
choices = [df['one'], df['two']]
df['que'] = np.select(conditions, choices, default=np.nan)
Урожайность
one two three que
0 10 1.2 4.2 10
1 15 70 0.03 70
2 8 5 0 NaN
Если мы можем предположить, что df['one'] >= df['two']
когда df['one'] < df['two']
является значение False, то можно было бы упростить условия и выбор до
conditions = [
df['one'] < df['two'],
df['one'] <= df['three']]
choices = [df['two'], df['one']]
(Th е предположение не может быть истинным, если df['one']
или df['two']
содержит пренебрежимо малые.)
Обратите внимание, что
a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])
определяет DataFrame с строковыми значениями. Так как они выглядят числовые, вы могли бы быть лучше преобразовать эти строки поплавка:
df2 = df.astype(float)
Это изменяет результаты, однако, поскольку строки сравнения символ за символом, в то время как поплавки сравниваются численно.
In [61]: '10' <= '4.2'
Out[61]: True
In [62]: 10 <= 4.2
Out[62]: False
Каким должно быть значение, если выражение 'if' является' False'? –
Ох, давайте скажем "" ... thnks. – Merlin
@Merlin: Если у вас числовые данные в столбце, лучше не смешивать его со строками. Это изменяет dtype столбца на 'object'. Это позволяет хранить произвольные объекты Python в столбце, но это связано с более медленными численными вычислениями. Таким образом, если столбец хранит числовые данные, предпочтительным является использование NaN для не-чисел. – unutbu