[英]Comparing Master List to Individual lists in a CSV row
我正在尝试使我的课堂自动化,并且将我的学生总数与有班级和学生的 dataframe 进行比较,我遇到了困难。 最终,代码将返回完整类的列表。
首先,我的学生总数列表称为all_kids
。
all_kids=['Kevin', 'Jack', 'Caroline', 'Grace', 'Harry', 'Sam']
df_kids=pd.DataFrame(all_kids)
然后,我的 class 信息在 CSV 文件中,其中一列是 class 期间,一列是 ZA2F21ED4F8EBC2ABCBB4DC 中的学生
姓名 | 孩子们 |
---|---|
英语 | 凯文、杰克、山姆、理查德 |
数学 | 卡罗琳、凯文、哈利、格蕾丝 |
有没有办法将我的孩子总数与每个 class 中的孩子进行比较并返回如下内容:
姓名 | 孩子们 | 地位 |
---|---|---|
英语 | 凯文、杰克、山姆、理查德 | 未满 |
数学 | 卡罗琳、凯文、哈利、格蕾丝 | 满的。 |
在这里,Math 是满的,因为这四个孩子都出现在all_kids
中,但是 English 不是满的,因为 Richard 不包括在all_kids
中。
谢谢!
您可以使用带有expand=True
的str.split
来拆分Kids
列中的字符串,然后使用.isin
+ .all
创建一个 boolean 掩码,然后将其与np.where
一起使用到 select 相应的Status
:
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
您需要做的是检查 all_kids 中是否存在“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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.