每当其他语句时,All()都会打印

时间:2019-12-24 15:41:34

标签: pandas

基本上,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

2 个答案:

答案 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