基本上,pandas对象不是单独应用于整个数据帧
这就是为什么它将进入else
条件的原因。我们需要在每一行上应用
在一个row
帧上应用时,我得到了适当的输出。应用整个数据帧时,每行都出现错误No keys
,基本上res
的某些行有None
,只有那些行应该是No keys
样本数据框
res,url1,url2
{'bool': True, 'val':False},{'bool': False, 'val':False},{'bool': True, 'val':False}
None,{'bool': True, 'val':False},{'bool': False, 'val':False}
{'bool': False, 'val':False},},{'bool': True, 'val':False},{'bool': True, 'val':False}
代码
def func1():
return ('url1')
def func2():
return ('url2')
def test_func():
if df['res'].str['bool'].all() and df['url1'].str['bool'].all():
return func1()
elif df['res'].str['bool'].all() and df['url2'].str['bool'].all():
return func2()
else:
return ("No Keys")
预期中
output
url1
No Keys
url2
我不在
No keys
No Keys
No Kyes
我需要在以下代码上应用5000个以上的网址
df['output'] = df.apply(test_func)
应用时出现错误,每行没有键
如果我通过any
False
是因为url1
布尔的第一行是False
问题是,如果all()检查所有行,因为第二行中均不存在它,则打印No Keys
答案 0 :(得分:2)
重新创建DataFrame
res url1 \
0 {'bool': True, 'val': False} {'bool': False, 'val': False}
1 None {'bool': True, 'val': False}
2 {'bool': False, 'val': False} {'bool': True, 'val': False}
url2
0 {'bool': True, 'val': False}
1 {'bool': False, 'val': False}
2 {'bool': True, 'val': False}
使用pd.apply
df.apply(lambda x: 'url1' if (x['res'] != None and x['res'].get('bool') and x['url1'].get('bool'))\
else 'url2' if (x['res'] != None and x['res'].get('bool') and x['url2'].get('bool'))
else 'No Keys',1)
Output
0 url2
1 No Keys
2 No Keys
dtype: object
注意-对于第三行,res bool值为False,因此执行and
会得出false,因此No Keys
答案 1 :(得分:1)
您还可以使用嵌套的np.where
:
import pandas as pd
import numpy as np
#Recreate dataframe
df = pd.DataFrame(data = {
'res': [{'bool': True, 'val':False}, None, {'bool': False, 'val':False}],
'url1':[{'bool': False, 'val':False}, {'bool': True, 'val':False}, {'bool': True, 'val':False}],
'url2':[{'bool': True, 'val':False},{'bool': False, 'val':False},{'bool': True, 'val':False}]})
# Define logic
df['Output'] = np.where(df['res'].str['bool'] & df['url1'].str['bool'], 'url1',
np.where(df['res'].str['bool'] & df['url2'].str['bool'], 'url2',
'No Keys'))
# Check Result
df
res ... Output
0 {'bool': True, 'val': False} ... url2
1 None ... No Keys
2 {'bool': False, 'val': False} ... No Keys