数据框如下面屏幕截图的左侧.

我想按名称分组,找出缺少哪些数字(与[1,2,3,4,5]相比).

理想的输出是屏幕截图的右侧.

我试过以下代码.但GroupBy后面的"星星数"列被视为字符串列表.所以它不进行比较.

有什么办法可以帮我修吗?非常感谢.

enter image description here

import pandas as pd
from io import StringIO

csvfile = StringIO("""
Name    Number of stars
Benjamin    1,3,2,1,2
Benjamin    2,5,1,3
Emma    2,1,1,4,4,2
Ethan   2,5,4
Emma    2,2,2
Ethan   5,4,4,1,1,1
Olivia  4,1,3,5""")

df = pd.read_csv(csvfile, sep = '\t', engine='python')

df_1 = df.groupby('Name')['Number of stars'].apply(list)

df_1 = df_1.to_frame().reset_index()

df_1['all stars'] = pd.Series([list(range(1,6)) for x in range(len(df_1.index))])
df_1['diff'] = df_1['all stars'].map(set) - df_1['Number of stars'].map(set)

print (df_1)

输出:

   Name       Number of stars        all stars             diff
0  Benjamin  [1,3,2,1,2, 2,5,1,3]  [1, 2, 3, 4, 5]  {1, 2, 3, 4, 5}
1      Emma  [2,1,1,4,4,2, 2,2,2]  [1, 2, 3, 4, 5]  {1, 2, 3, 4, 5}
2     Ethan  [2,5,4, 5,4,4,1,1,1]  [1, 2, 3, 4, 5]  {1, 2, 3, 4, 5}
3    Olivia             [4,1,3,5]  [1, 2, 3, 4, 5]  {1, 2, 3, 4, 5}

推荐答案

让我们将数据帧按Name分组,并使用返回所需集差的自定义lambda函数聚合Number of stars:

s = set(range(1, 6))
df.groupby('Name')['Number of stars']\
  .agg(lambda x: s - set(int(z) for y in x for z in y.split(',')))

Name
Benjamin       {4}
Emma        {3, 5}
Ethan          {3}
Olivia         {2}
Name: Number of stars, dtype: object

Python相关问答推荐

如果在第一行之前不存在其他条件,如何获得满足口罩条件的第一行?

Python(Polars):使用之前的变量确定当前解决方案的Vector化操作

使用Python从HTTP打印值

不同数据类型的Python成员变量不会在具有相同优先级的不同线程中更新

手动为pandas中的列上色

是否有方法将现有的X-Y图转换为X-Y-Y1图(以重新填充)?

将词典写入Excel

避免循环的最佳方法

如何将新的SQL服务器功能映射到SQL Alchemy的ORM

指示组内的rejected_time是否在creation_timestamp后5分钟内

Django管理面板显示字段最大长度而不是字段名称

如何在Python中将returns.context. DeliverresContext与Deliverc函数一起使用?

运行总计基于多列pandas的分组和总和

如何使用根据其他值相似的列从列表中获取的中间值填充空NaN数据

Odoo 16使用NTFS使字段只读

如何在UserSerializer中添加显式字段?

Python Pandas获取层次路径直到顶层管理

无论输入分辨率如何,稳定扩散管道始终输出512 * 512张图像

基于形状而非距离的两个numpy数组相似性

如何创建引用列表并分配值的Systemrame列