Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.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_Pandas - Fatal编程技术网

Python 在两个不同列上具有两个条件的数据帧

Python 在两个不同列上具有两个条件的数据帧,python,pandas,Python,Pandas,我想根据两个不同列上的两个条件过滤数据帧。在下面的示例中,我希望过滤数据帧df以包含行,从而使其包含uids,其中val列的值计数大于4大于2 df=pd.DataFrame({'uid':[1,1,1,2,2,3,3,4,4,4],'iid':[11,12,13,13,14,14,11,12],'val':[3,4,5,3,5,4,3,4]。 对于这个数据帧,我的输出应该是 df uid iid val 0 1 11 3 1 1 12 4 2

我想根据两个不同列上的两个条件过滤数据帧。在下面的示例中,我希望过滤数据帧
df
以包含行,从而使其包含
uid
s,其中
val
列的值计数大于4大于2

df=pd.DataFrame({'uid':[1,1,1,2,2,3,3,4,4,4],'iid':[11,12,13,13,14,14,11,12],'val':[3,4,5,3,5,4,3,4]。

对于这个数据帧,我的输出应该是

 df
   uid  iid  val
0    1   11    3
1    1   12    4
2    1   13    5
5    3   13    4
6    3   14    5
7    4   14    4
8    4   11    3
9    4   12    4

这里,我过滤掉了
uid
2,因为
uid==2
val>=4
的行数小于2。我只想保留
uid
行,其中值大于4的
val
数大于或等于2。

您需要
groupby。使用
sum
转换
一次,检查val大于或等于
ge
的位置。并检查结果是否为
ge
,以将其用作df上的布尔过滤器

print (df[df['val'].ge(4).groupby(df['uid']).transform(sum).ge(2)])
   uid  iid  val
0    1   11    3
1    1   12    4
2    1   13    5
5    3   13    4
6    3   14    5
7    4   14    4
8    4   11    3
9    4   12    4
编辑:另一种避免
groupby.transform
的方法是
loc
val小于4的行和列uid,在其上使用
value\u counts
,并在
ge
2的位置实现。然后
map
返回uid列以在df上创建布尔过滤器。同样的结果,可能更快

df[df['uid'].map(df.loc[df['val'].ge(4), 'uid'].value_counts().ge(2))]