Панда условный фильтр - PullRequest
       5

Панда условный фильтр

0 голосов
/ 23 ноября 2018

У меня есть фрейм данных

   A     B     C
0  True  True  True
1  True  False False
2  False False False

Я хотел бы добавить строку D со следующими условиями:

D - true, если A, B и C - true.Иначе, D. ложно.

Я пытался

df['D'] = df.loc[(df['A'] == True) & df['B'] == True & df['C'] == True] 

Я получаю

TypeError: cannot compare a dtyped [float64] array with a scalar of type [bool]

Затем я попытался следовать этому примеру и написалфункция, подобная предложенной в ссылке:

def all_true(row):

   if row['A'] == True:
      if row['B'] == True:
         if row['C'] == True:
             val = True
   else:
      val = 0

return val

df['D'] = df.apply(all_true(df), axis=1)

В этом случае я получу

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Буду признателен за предложения.Спасибо!

Ответы [ 3 ]

0 голосов
/ 23 ноября 2018

Или еще лучше:

df['D']=df.all(1)

А теперь:

print(df)

Есть:

       A      B      C      D
0   True   True   True   True
1   True  False  False  False
2  False  False  False  False
0 голосов
/ 23 ноября 2018

Использование панд eval:

df['D'] = df.eval('A & B & C')

Или:

df = df.eval('D = A & B & C')
#alternative inplace df.eval('D = A & B & C', inplace=True)

Или:

df['D'] = np.all(df.values,1)

print(df)
       A      B      C      D
0   True   True   True   True
1   True  False  False  False
2  False  False  False  False
0 голосов
/ 23 ноября 2018

Сравнение с True необязательно, только логические цепочки маски с &:

df['D'] = df['A'] & df['B'] & df['C']

Если важна производительность:

df['D'] = df['A'].values & df['B'].values & df['C'].values

Или используйте DataFrame.all для проверки всех True с в строках:

df['D'] = df[['A','B','C']].all(axis=1)

#numpy all 
#df['D'] = np.all(df.values,1)

print (df)
       A      B      C      D
0   True   True   True   True
1   True  False  False  False
2  False  False  False  False

Производительность :

g

np.random.seed(125)

def all1(df):
    df['D'] = df.all(axis=1)
    return df

def all1_numpy(df):
    df['D'] = np.all(df.values,1)
    return df

def eval1(df):
    df['D'] = df.eval('A & B & C')
    return df

def chained(df):
    df['D'] = df['A'] & df['B'] & df['C']
    return df

def chained_numpy(df):
    df['D'] = df['A'].values & df['B'].values & df['C'].values
    return df

def make_df(n):
    df = pd.DataFrame({'A':np.random.choice([True, False], size=n),
                       'B':np.random.choice([True, False], size=n),
                       'C':np.random.choice([True, False], size=n)})
    return df

perfplot.show(
    setup=make_df,
    kernels=[all1, all1_numpy, eval1,chained,chained_numpy],
    n_range=[2**k for k in range(2, 25)],
    logx=True,
    logy=True,
    equality_check=False,
    xlabel='len(df)')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...