【问题标题】:Comparing Master List to Individual lists in a CSV row比较 CSV 行中的主列表和单个列表
【发布时间】:2021-04-07 20:29:33
【问题描述】:

我正在尝试自动化我的课堂,但在将我的学生总数与包含班级和学生的数据框进行比较时遇到了困难。最终,代码将返回完整类的列表。

首先,我的学生总数称为all_kids

all_kids=['Kevin', 'Jack', 'Caroline', 'Grace', 'Harry', 'Sam']
df_kids=pd.DataFrame(all_kids)

然后,我的班级信息在 CSV 文件中,其中一列是上课时间,一列是该班级的学生

Name Kids
English Kevin, Jack, Sam, Richard
Math Caroline, Kevin, Harry, Grace

有没有办法将我的孩子总数与每个班级的孩子进行比较并返回如下内容:

Name Kids Status
English Kevin, Jack, Sam, Richard Not Full
Math Caroline, Kevin, Harry, Grace Full.

这里,数学是满的,因为这四个孩子都出现在all_kids,但英语不满,因为理查德不包括在all_kids

谢谢!

【问题讨论】:

    标签: python pandas string list dataframe


    【解决方案1】:

    您可以使用str.splitexpand=True 来拆分Kids 列中的字符串,然后使用.isin + .all 创建一个布尔掩码,然后将其与np.where 一起使用以选择相应的@ 987654331@:

    m = df_class['Kids'].str.split(r', ', expand=True).isin(all_kids).all(1)
    df_class['Status'] = np.where(m, 'Full', 'Not Full')
    

    或者,您可以split Kids 列中的字符串,然后在列表理解中使用 set.issubset 检查 set 成员资格:

    m = [set(k.split(', ')).issubset(all_kids) for k in df_class['Kids']]
    df_class['Status'] = np.where(m, 'Full', 'Not Full')
    

          Name                           Kids    Status
    0  English      Kevin, Jack, Sam, Richard  Not Full
    1     Math  Caroline, Kevin, Harry, Grace      Full
    

    【讨论】:

      【解决方案2】:

      您需要做的是检查 'Kids' 变量中存在的每个名称是否存在于 all_kids 中。在逻辑上,这意味着从Kids 的每一行中排除all_kids 并观察它是否为空。 当然,您首先需要将Kids str 列拆分为列表列:

      这段代码对我有用:

      
      import numpy as np
      import pandas as pd 
      
      all_kids=['Kevin', 'Jack', 'Caroline', 'Grace', 'Harry', 'Sam']
      df_kids=pd.DataFrame(all_kids)
      
      
      df = pd.DataFrame(None, columns =  ['Name', 'Kids'])
      df.loc[0] = ['English', 'Kevin, Jack, Sam, Richard']
      df.loc[1] = ['Math', 'Caroline, Kevin, Harry, Grace']
      
      df['list'] = df['Kids'].apply(lambda s : s.split(', '))
      df['diff'] = df['list'].apply(lambda s : [elt for elt in s if elt not in all_kids]).apply(len)
      df['Status'] = np.where(df['diff'] == 0, 'Full', 'Not Full')
      
            Name                           Kids  ... diff    Status
      0  English      Kevin, Jack, Sam, Richard  ...    1  Not Full
      1     Math  Caroline, Kevin, Harry, Grace  ...    0      Full
      

      【讨论】:

        猜你喜欢
        • 2017-05-28
        • 2016-06-01
        • 2022-12-18
        • 2016-04-25
        • 2019-04-28
        • 1970-01-01
        • 1970-01-01
        • 2014-03-27
        • 1970-01-01
        相关资源
        最近更新 更多