gpt4 book ai didi

python - Pandas - 根据列内的排名删除单元格

转载 作者:行者123 更新时间:2023-11-30 23:18:58 26 4
gpt4 key购买 nike

我想根据值在列中的相对排名来删除它们。具体来说,我想隔离几列中的 X 最高值和 X 最低值。因此,如果 X=2 并且我的数据框如下所示:

ID    Val1    Val2    Val3    
001 2 8 14
002 10 15 8
003 3 1 20
004 11 11 7
005 14 4 19

输出应如下所示:

ID    Val1    Val2    Val3    
001 2 NaN NaN
002 NaN 15 8
003 3 1 20
004 11 11 7
005 14 4 19

我知道我可以使用以下方法创建一个子表来隔离高排名和低排名:

df = df.sort('Column Name')
df2 = df.head(X) # OR: df.tail(X)

我想我可以使用以下方法清除其他列中的值的子表:

df2['Other Column'] = np.NaN
df2['Other Column B'] = np.NaN

然后,当其中一个表中有数据时,以替换 NaN 值的方式将子表合并在一起。我尝试过:

df2.update(df3) # df3 is a sub-table made the same way as df2 using a different column

仅更新 df2 中已存在的行。

我尝试过:

out = pd.merge(df2, df3, how='outer')

当 df2 和 d3 中都出现一行时,它给了我单独的行

我尝试过:

out = df2.combine_first(df3)

在某些情况下用发现的 NaN 值覆盖数值,使其不合适。

必须有一种方法可以做到这一点:只要某个值不在该列中的 X 个最高值或 X 个最低值中,我就希望插入带有 NaN 值的原始数据帧。

最佳答案

有趣的问题,你可以在每列的排序值中获取每列值的索引(这里在 mask DataFrame 中),然后保留索引在您定义的边界内的值。

In [98]:
print df
Val1 Val2 Val3
ID
1 2 8 14
2 10 15 8
3 3 1 20
4 11 11 7
5 14 4 19
In [99]:

mask = df.apply(lambda x: np.searchsorted(sorted(x),x))
print mask
Val1 Val2 Val3
ID
1 0 2 2
2 2 4 1
3 1 0 4
4 3 3 0
5 4 1 3
In [100]:

print (mask<=1)|(mask>=(len(mask)-2))
Val1 Val2 Val3
ID
1 True False False
2 False True True
3 True True True
4 True True True
5 True True True
In [101]:

print df.where((mask<=1)|(mask>=(len(mask)-2)))
Val1 Val2 Val3
ID
1 2 NaN NaN
2 NaN 15 8
3 3 1 20
4 11 11 7
5 14 4 19

关于python - Pandas - 根据列内的排名删除单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26387973/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com