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

Python 如何仅对数据帧中的特定行进行排序?

Python 如何仅对数据帧中的特定行进行排序?,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个数据框,它包含参与某一行为的人的百分比,以及普通人群的指数。我想按指数对这些行为进行排名。。。但我想从这个排名中排除非常低的发病率行为 如果我只是限制整个数据帧以排除这些行为,那么很容易做到,但这里有一个问题——我仍然希望将它们包括在我的df中;我只是不想把他们列入排行榜 我的数据帧是这样开始的,以组作为索引: GROUP BEHAVIOR SUBBEHAVIOR PERCENT INDEX GROUP1 behavior1 foo 0.521

我有一个数据框,它包含参与某一行为的人的百分比,以及普通人群的指数。我想按指数对这些行为进行排名。。。但我想从这个排名中排除非常低的发病率行为

如果我只是限制整个数据帧以排除这些行为,那么很容易做到,但这里有一个问题——我仍然希望将它们包括在我的df中;我只是不想把他们列入排行榜

我的数据帧是这样开始的,以组作为索引:

GROUP     BEHAVIOR  SUBBEHAVIOR  PERCENT  INDEX
GROUP1    behavior1 foo          0.521    123
GROUP1    behavior2 bar          0.013    213
GROUP1    behavior2 fuzz         1.034    103
GROUP1    behavior3 foobar       0.750    131
GROUP2    behavior1 foo          1.521    101
GROUP2    behavior2 bar          0.913    91
GROUP2    behavior2 fuzz         0.034    301
GROUP2    behavior3 foobar       0.950    87
但我不想,比方说,第二排排排在0.013。我想要的是:

GROUP     BEHAVIOR  SUBBEHAVIOR  PERCENT  INDEX  RANK
GROUP1    behavior1 foo          0.521    123    2
GROUP1    behavior2 bar          0.013    213    NaN
GROUP1    behavior2 fuzz         1.034    103    3
GROUP1    behavior3 foobar       0.750    131    1
GROUP2    behavior1 foo          1.521    101    1
GROUP2    behavior2 bar          0.913    91     2
GROUP2    behavior2 fuzz         0.034    301    NaN
GROUP2    behavior3 foobar       0.950    87     3
通过这样做,我实现了上述目标:

filtered = df[fd.loc[:,'PERCENT']>0.05].copy()
filtered['RANK'] = filtered.groupby(level=0).rank(ascending=False)['INDEX']
final = df.merge(filtered, on=df.columns.tolist(), how='left')
(我有更多的列使子行为真正独一无二,因此我通过了df的所有列。)

这是可行的,但感觉这是一种非常笨拙的方法,我想知道是否有更好、更优雅的方法。有吗

df.join(df.loc[df['PERCENT']>0.05].groupby('GROUP')['INDEX'].rank(ascending=False).rename('RANK'))
如果在运行计算之前创建空白列,也可能使用.map()+.insert()或.update()

两种方法 使用
df.where

由于NA组在
groupby
()中自动排除,并且的默认NA处理方式是保持其原样,因此您可以将其用于筛选器并直接继续

df['RANK'] = (df.where(df.PERCENT > .05)
                 .groupby('GROUP')
                 .rank(ascending=False)
                 .INDEX)

简单的解决方案

或者,只需先重置数据帧上的索引,以便有一个标识符来对齐索引

df.reset_index(inplace=True)
df['RANK'] = (df.query('PERCENT > .05')  # or using a mask ofc
                .groupby('GROUP')
                .rank(ascending=False)
                .INDEX)
查询
可以替换为布尔索引,比如
df[df.PERCENT>.05]

那么

>>> df.set_index('GROUP')

         BEHAVIOR SUBBEHAVIOR  PERCENT  INDEX  RANK
GROUP                                              
GROUP1  behavior1         foo    0.521    123   2.0
GROUP1  behavior2         bar    0.013    213   NaN
GROUP1  behavior2        fuzz    1.034    103   3.0
GROUP1  behavior3      foobar    0.750    131   1.0
GROUP2  behavior1         foo    1.521    101   1.0
GROUP2  behavior2         bar    0.913     91   2.0
GROUP2  behavior2        fuzz    0.034    301   NaN
GROUP2  behavior3      foobar    0.950     87   3.0

我没有使用组作为索引;)。groupby('GROUP')我在此之前重置了索引。我只是没有把它包括在代码中。我的错误。
>>> df.set_index('GROUP')

         BEHAVIOR SUBBEHAVIOR  PERCENT  INDEX  RANK
GROUP                                              
GROUP1  behavior1         foo    0.521    123   2.0
GROUP1  behavior2         bar    0.013    213   NaN
GROUP1  behavior2        fuzz    1.034    103   3.0
GROUP1  behavior3      foobar    0.750    131   1.0
GROUP2  behavior1         foo    1.521    101   1.0
GROUP2  behavior2         bar    0.913     91   2.0
GROUP2  behavior2        fuzz    0.034    301   NaN
GROUP2  behavior3      foobar    0.950     87   3.0