Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫:根据包含列表的列筛选行_Python_Python 3.x_Pandas - Fatal编程技术网

Python 熊猫:根据包含列表的列筛选行

Python 熊猫:根据包含列表的列筛选行,python,python-3.x,pandas,Python,Python 3.x,Pandas,如何基于另一列值筛选数据帧中的行 我有一个数据框 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

如何基于另一列值筛选数据帧中的行

我有一个数据框

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,即“最小标记”列,然后必须添加一个名为“flag”的新列作为1

  • 对于索引1,“最小主题”为“1”,“标记”列中至少有一个元素应大于85,即“最小标记”列,然后必须添加一个名为“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'])]
将布尔值按
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'])]


要避免
for
循环并充分利用并行计算,您可以使用新函数(0.25.0):

输出:

  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
  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
比较列
标记
最小标记

df['flag'] = df1['marks'].gt(df1['min_marks'])\
.groupby(df1.index).sum().ge(df['min_subjects']).astype(int)

print(df)
输出:

  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
  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