首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >熊猫:基于包含列表的列过滤行

熊猫:基于包含列表的列过滤行
EN

Stack Overflow用户
提问于 2019-11-12 11:15:04
回答 2查看 505关注 0票数 5

如何基于另一列值过滤数据帧中的行?

我有一个数据框架,

代码语言:javascript
复制
ip_df:
     class    name     marks          min_marks  min_subjects
0    I        tom      [89,85,80,74]  80         2
1    II       sam      [65,72,43,40]  85         1

根据"min_subject“和"min_marks”的列值,应对行进行筛选。

对于索引0,“

  • ”为"2",“标记”列中至少有2个元素应大于80,即"min_marks“列必须添加一个名为”标志“的新列作为索引1的1
  • ,"min_subjects”为"1",“标记”列中至少有一个元素应大于85,即“标记”列中的"min_marks“列必须添加为0。flag=0作为条件,这里不满足)

最终结果应该是,

代码语言:javascript
复制
op_df:
     class    name     marks          min_marks  min_subjects flag
0    I        tom      [89,85,80,74]  80         2            1
1    II       sam      [65,72,43,40]  85         1            0

有人能帮助我在数据框架中实现同样的目标吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-12 11:20:58

使用zip 3列对列表的理解,比较生成器中的每个值和sum中的计数,最后用最小标记进行比较并转换为整数:

代码语言:javascript
复制
df['flag'] = [1 if sum(x > c for x in a) >= b else 0 
                 for a, b, c in zip(df['marks'], df['min_subjects'], df['min_marks'])]

通过int将布尔值转换为0,1的替代方法

代码语言:javascript
复制
df['flag'] = [int(sum(x > c for x in a) >= b)
                 for a, b, c in zip(df['marks'], df['min_subjects'], df['min_marks'])]

或使用numpy解决方案

代码语言:javascript
复制
df['flag'] = [int(np.sum(np.array(a) > c) >= b)
                  for a, b, c in zip(df['marks'], df['min_subjects'], df['min_marks'])]

代码语言:javascript
复制
print (df)
  class name             marks  min_marks  min_subjects  flag
0     I  tom  [89, 85, 80, 74]         80             2     1
1    II  sam  [65, 72, 43, 40]         85             1     0
票数 3
EN

Stack Overflow用户

发布于 2019-11-12 11:50:34

为了避免for循环并充分利用并行计算,您可以使用新函数explode (Pandas0.25.0):

代码语言:javascript
复制
df1 = df.explode('marks')
print(df1)

输出:

代码语言:javascript
复制
  class name marks  min_marks  min_subjects
0     I  tom    89         80             2
0     I  tom    85         80             2
0     I  tom    80         80             2
0     I  tom    74         80             2
1    II  sam    65         85             1
1    II  sam    72         85             1
1    II  sam    43         85             1
1    II  sam    40         85             1

比较列marksmin_marks

代码语言:javascript
复制
df['flag'] = df1['marks'].gt(df1['min_marks'])\
.groupby(df1.index).sum().ge(df['min_subjects']).astype(int)

print(df)

输出:

代码语言:javascript
复制
  class name             marks  min_marks  min_subjects  flag
0     I  tom  [89, 85, 80, 74]         80             2     1
1    II  sam  [65, 72, 43, 40]         85             1     0
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58817539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档