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')
您可以使用withexpand=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