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