gpt4 book ai didi

python - Pandas : filter the rows based on a column containing lists

转载 作者:行者123 更新时间:2023-12-02 02:24:34 25 4
gpt4 key购买 nike

如何根据另一个列值过滤数据框中的行?

我有一个数据框,

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,“min_subjects”为“2”,“marks”列中至少有 2 个元素应大于 80,即“min_marks”列,则必须创建一个名为“flag”的新列添加为 1

  • 对于索引 1,“min_subjects”为“1”,“marks”列中至少有 1 个元素应大于 85,即“min_marks”列,然后必须创建一个名为“flag”的新列添加为 0(即,flag=0,因为此处不满足条件)

最终结果应该是,

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

任何人都可以帮助我在数据框中实现相同的目标吗?

最佳答案

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

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'])]

替代将 bool 值由 int 转换为 0,1:

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解决方案:

df['flag'] = [int(np.sum(np.array(a) > c) >= b)
for a, b, c in zip(df['marks'], df['min_subjects'], df['min_marks'])]
<小时/>
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

关于python - Pandas : filter the rows based on a column containing lists,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58817539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com