Python 将主列表与CSV行中的单个列表进行比较

Python 将主列表与CSV行中的单个列表进行比较,python,pandas,string,list,dataframe,Python,Pandas,String,List,Dataframe,我正试图使我的课堂自动化,我把我的学生总名单与一个包含班级和学生的数据框架进行比较,这让我碰上了一堵墙。最终,代码将返回完整类的列表 首先,我的学生总数列表称为all_kids all_kids=['Kevin', 'Jack', 'Caroline', 'Grace', 'Harry', 'Sam'] df_kids=pd.DataFrame(all_kids) 然后,我的班级信息在一个CSV文件中,其中一列是班级时间,一列是该班级的学生 名称 孩子们 英语 凯文,杰克,山姆,理查德 数学

我正试图使我的课堂自动化,我把我的学生总名单与一个包含班级和学生的数据框架进行比较,这让我碰上了一堵墙。最终,代码将返回完整类的列表

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

all_kids=['Kevin', 'Jack', 'Caroline', 'Grace', 'Harry', 'Sam']
df_kids=pd.DataFrame(all_kids)
然后,我的班级信息在一个CSV文件中,其中一列是班级时间,一列是该班级的学生

名称 孩子们 英语 凯文,杰克,山姆,理查德 数学 卡罗琳,凯文,哈利,格蕾丝
您需要做的是检查“Kids”变量中的每个名称是否都存在于所有的\u 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')
您可以使用with
expand=True
拆分
Kids
列中的字符串,然后使用+创建布尔掩码,然后将其与
np一起使用。其中
选择相应的
状态

m = df_class['Kids'].str.split(r', ', expand=True).isin(all_kids).all(1)
df_class['Status'] = np.where(m, 'Full', 'Not Full')
或者,您可以
拆分
Kids
列中的字符串,然后在列表中使用以下方法检查
设置
成员资格:


m = df_class['Kids'].str.split(r', ', expand=True).isin(all_kids).all(1)
df_class['Status'] = np.where(m, 'Full', 'Not Full')
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