【问题标题】:how to apply a check on below scenarios using if else conditions?如何使用 if else 条件对以下情况进行检查?
【发布时间】:2022-10-04 21:07:01
【问题描述】:

我有一个这样的数据框 -Please refer the dataframe as in the image shown

有四列('status','preferred_time','history','id'),需要检查所有列是否都有一些值,在历史列中,在某些情况下它是一个嵌套列表,所以需要特别检查嵌套列表是否有所有强制键 'branch','rank','discharge_status','service_start',job_code','post_intention' 有值,如果在数据框中添加一个名为“输出”的列所有列都有值,然后将其命名为“已完成”,如果任何列或历史列中的空白或 NaN 或 [{}] 缺少任何键值对,则将其命名为“待定”。

从图像中,只有第一行应该处于完成状态,其余的应该处于挂起状态。

如果在这种情况下出现其他情况,请帮助我更好地构建。 提前致谢。

上述df图像的字典 -

{'status': {0: 'No', 1: 'No', 2: nan, 3: 'No', 4: 'No'},
 'preferred_time': {0: "['Morning', 'Midday', 'Afternoon']",
  1: [],
  2: "['Morning'] ",
  3: nan,
  4: "['Morning', 'Midday'] "},
 'history': {0: "[{'branch': 'A', 'rank': 'E7', 'discharge_status': 'Honorable Discharge', 'service_start': '1999-02-13', 'job_code': '09', 'post_intention': ['No']}]",
  1: "[{'branch': 'A', 'rank': 'E7', 'discharge_status': 'Honorable Discharge', 'service_start': '1999-02-13', 'job_code': '09', 'post_intention': ['No']}]",
  2: "[{'branch': 'A', 'rank': 'E7', 'discharge_status': 'Honorable Discharge', 'service_start': '1995-02-13', 'job_code': '09', 'post_intention': ['No']},{'branch': 'A', 'rank: 'E6', 'discharge_status': 'Honorable Discharge', 'service_start': '2015-02-13', 'job_code': '09'}]",
  3: nan,
  4: '[{}]'},
 'id': {0: 1, 1: 5, 2: 2, 3: 3, 4: 4}}

我尝试了下面的代码行 - 但我不知道如何在一个 if 语句中检查所有四列 -

for i in df.index:
    status = df['status'][i]
    preferred_time = df['preferred_time'][i]
    id = df['id'][i]
    history = df['history'][i]
    if status and preferred_time and id and status!='' and preferred_time!= '' and id!='':
        enroll_status = "completed"
    else:
        enroll_status = "pending"
    if history!= '' or str(history)!= '[{}]':
        for item in history:
            if 'branch' in item.keys() and'rank' in item.keys() and'discharge_status' in item.keys() and'service_start' in item.keys() and 'job_code' in item.keys() and 'post_intention' in item.keys():
                enroll_status = "completed"
            else:
                enroll_status = "pending"

【问题讨论】:

  • 如果您可以粘贴df.head().to_dict() 的结果(其中df 是您的数据框),而不是提供图像,这将很有帮助。
  • @BenGrossmann stackoverflow.com/users/2476977/ben-grossmann,为数据框创建了一个字典。
  • 你试图解决这个问题是什么,你在哪里卡住了? @deepu2711
  • @Vishnudev stackoverflow.com/users/5120049/vishnudev ,添加了我尝试过的代码行。
  • @deepu 您的数据框的条目是字符串而不是实际列表是否有原因?此外,您无需在回复中包含指向用户个人资料的链接。

标签: python pandas dataframe dictionary if-statement


【解决方案1】:

考虑以下:

import numpy as np
import pandas as pd
from numpy import nan

def check_list(L):
    if not isinstance(L,list):
        return False
    return all(k in d for k in keys_req for d in L)

labels = np.array(["pending","completed"])
keys_req = ['branch','rank','discharge_status','service_start','job_code','post_intention']
d = {'status': {0: 'No', 1: 'No', 2: nan, 3: 'No', 4: 'No'}, 'preferred_time': {0: "['Morning', 'Midday', 'Afternoon']", 1: nan, 2: "['Morning'] ", 3: nan, 4: "['Morning', 'Midday'] "}, 'history': {0: "[{'branch': 'A', 'rank': 'E7', 'discharge_status': 'Honorable Discharge', 'service_start': '1999-02-13', 'job_code': '09', 'post_intention': ['No']}]", 1: nan, 2: "[{'branch': 'A', 'rank': 'E7', 'discharge_status': 'Honorable Discharge', 'service_start': '1995-02-13', 'job_code': '09', 'post_intention': ['No']},{'branch': 'A', 'rank': 'E6', 'discharge_status': 'Honorable Discharge', 'service_start': '2015-02-13', 'job_code': '09'}]", 3: nan, 4: '[{}]'}, 'id': {0: 1, 1: 5, 2: 2, 3: 3, 4: 4}}

df = pd.DataFrame(d)
df['history_list'] = df['history'].apply(lambda x: eval(x) if isinstance(x,str) else x)
df['mandatory_keys'] = df['history_list'].apply(check_list)
df['no_nans'] = ~pd.isna(df).any(axis = 1)
df['output_tf'] = df['mandatory_keys'] & df['no_nans']
df['output'] = labels[df['output_tf'].to_numpy(dtype=int)]

请注意,我在复制的字典 d 版本中更正了您的数据框中的一些拼写错误(例如,'rank:'E7' 已替换为 'rank':'E7')。添加的增量列(history_list、mandatory_keys、no_nans、output_tf)是为了更容易理解我在这里应用的过程;例如,如果您想使用尽可能少的空间,则实际上没有必要将这些添加到数据框中。上面的脚本生成以下数据框df

  status                      preferred_time  
0     No  ['Morning', 'Midday', 'Afternoon']   
1     No                                 NaN   
2    NaN                        ['Morning']    
3     No                                 NaN   
4     No              ['Morning', 'Midday']    

                                             history  id  
0  [{'branch': 'A', 'rank': 'E7', 'discharge_stat...   1   
1                                                NaN   5   
2  [{'branch': 'A', 'rank': 'E7', 'discharge_stat...   2   
3                                                NaN   3   
4                                               [{}]   4   

                                        history_list  mandatory_keys  no_nans  
0  [{'branch': 'A', 'rank': 'E7', 'discharge_stat...            True     True   
1                                                NaN           False    False   
2  [{'branch': 'A', 'rank': 'E7', 'discharge_stat...           False    False   
3                                                NaN           False    False   
4                                               [{}]           False     True   

   output_tf     output  
0       True  completed  
1      False    pending  
2      False    pending  
3      False    pending  
4      False    pending 

这是一个更简洁的版本(它不添加不必要的列或存储额外的“标签”变量)。

import numpy as np
import pandas as pd
from numpy import nan

def check_list(L):
    if not isinstance(L,list):
        return False
    return all(k in d for k in keys_req for d in L)

keys_req = ['branch','rank','discharge_status','service_start','job_code','post_intention']
d = {'status': {0: 'No', 1: 'No', 2: nan, 3: 'No', 4: 'No'}, 'preferred_time': {0: "['Morning', 'Midday', 'Afternoon']", 1: nan, 2: "['Morning'] ", 3: nan, 4: "['Morning', 'Midday'] "}, 'history': {0: "[{'branch': 'A', 'rank': 'E7', 'discharge_status': 'Honorable Discharge', 'service_start': '1999-02-13', 'job_code': '09', 'post_intention': ['No']}]", 1: nan, 2: "[{'branch': 'A', 'rank': 'E7', 'discharge_status': 'Honorable Discharge', 'service_start': '1995-02-13', 'job_code': '09', 'post_intention': ['No']},{'branch': 'A', 'rank': 'E6', 'discharge_status': 'Honorable Discharge', 'service_start': '2015-02-13', 'job_code': '09'}]", 3: nan, 4: '[{}]'}, 'id': {0: 1, 1: 5, 2: 2, 3: 3, 4: 4}}    
df = pd.DataFrame(d)

df['output'] = np.array(["pending","completed"])[
    (df['history'].apply(lambda x: eval(x) if isinstance(x,str) else x)
                  .apply(check_list)
     & ~pd.isna(df).any(axis = 1)
     ).to_numpy(dtype=int)]

解决您最新评论的版本:

df = pd.DataFrame(d)
display(df)
df['output'] = np.array(["pending","completed"])[
    (df['history'].apply(lambda x: eval(x) if isinstance(x,str) else x)
                  .apply(check_list)
     & ~pd.isna(df).any(axis = 1)
     & df['preferred_time']!="[]"
    ).to_numpy(dtype=int)]

【讨论】:

  • stackoverflow.com/users/2476977/ben-grossmann,这个解决方案效果很好,但是我有一个案例在首选时间有空 [] 列表,它也显示输出为已完成,应该作为未决,因为它没有价值,我应该如何检查它?请帮忙。还使用 preferred_time 列中的另一种情况更新了数据框的字典。
猜你喜欢
  • 2023-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多