Python 熊猫条件过滤器
我有一个数据帧Python 熊猫条件过滤器,python,pandas,Python,Pandas,我有一个数据帧 A B C 0 True True True 1 True False False 2 False False False 我想添加一个具有以下条件的D行: 如果A、B和C为真,则D为真。否则,D是假的 我试过了 df['D'] = df.loc[(df['A'] == True) & df['B'] == True & df['C'] == True] 我明白了 然后我尝试按照链接中的建议编写了一个类似的函数: def a
A B C
0 True True True
1 True False False
2 False False False
我想添加一个具有以下条件的D行:
如果A、B和C为真,则D为真。否则,D是假的
我试过了
df['D'] = df.loc[(df['A'] == True) & df['B'] == True & df['C'] == True]
我明白了
然后我尝试按照链接中的建议编写了一个类似的函数:
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().
我很感谢你的建议。谢谢 与
True
相比,无需使用和的ony-chain布尔掩码:
df['D'] = df['A'] & df['B'] & df['C']
如果绩效很重要:
df['D'] = df['A'].values & df['B'].values & df['C'].values
或用于检查每行的所有True
s:
df['D'] = df[['A','B','C']].all(axis=1)
#numpy all
#df['D'] = np.all(df.values,1)
性能:
或者更好:
df['D']=df.all(1)
现在:
print(df)
是:
使用熊猫:
或:
或:
@jezrael,什么是perfplot
这是matplotlib导入吗?我喜欢学习这是一个很好的例子。不,这是自定义模块,从unutbu学习,-但它使用matplotlibGood Try+1:-)
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)')
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
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