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