如何在数据帧中只保留前N个值

2024-05-13 23:56:37 发布

您现在位置:Python中文网/ 问答频道 /正文

它是pandas/Dataframe,对于每一行,我只想保留前N(N=3)个值,并将其他值设置为nan

import pandas as pd
import numpy as np

data = np.array([['','day1','day2','day3','day4','day5'],
                ['larry',1,4,4,3,5],
                ['gunnar',2,-1,3,4,4],
                ['tin',-2,5,5, 6,7]])
                
df = pd.DataFrame(data=data[1:,1:],
                  index=data[1:,0],
                  columns=data[0,1:])
print(df) 

输出为

       day1 day2 day3 day4 day5
larry     1    4    4    3    5
gunnar    2   -1    3    4    4
tin      -2    5    5    6    7

我想去

       day1 day2 day3 day4 day5
larry   NaN    4    4  NaN    5
gunnar  NaN  NaN    3    4    4
tin     NaN    5  NaN    6    7

pandas: Keep only top n values and set others to 0类似,但我只需要保留N个最高可用值,否则平均值不正确

对于上面的结果,我只想保留第一个5


Tags: importpandasdataasnpnanpdtin
3条回答

您可以使用np.unique对第五大值进行排序和查找,并使用where

uniques = np.unique(df)

# what happens if len(uniques) < 5?
thresh = uniques[-5]
df.where(df >= thresh)

输出:

        day1  day2  day3  day4  day5
larry    NaN   4.0     4     3     5
gunnar   NaN   NaN     3     4     4
tin      NaN   5.0     5     6     7

更新:再看一眼,我想你可以做到:

df.apply(pd.Series.nlargest, n=3,axis=1).reindex(df.columns, axis=1)

输出:

        day1  day2  day3  day4  day5
larry    NaN   4.0   4.0   NaN   5.0
gunnar   NaN   NaN   3.0   4.0   4.0
tin      NaN   5.0   NaN   6.0   7.0

这里是另一种使用df.rankon axis=1的方法,我们反转列并计算秩,因为在重复的列上,您希望保留第一个值

df[df.astype(float).iloc[:,::-1].rank(1,'first').ge(3)]

       day1 day2 day3 day4 day5
larry   NaN    4    4  NaN    5
gunnar  NaN  NaN    3    4    4
tin     NaN    5  NaN    6    7

然而,正如@Allolz正确指出的,对于基于df形状的一般用例,可以使用:

N=3
n = df.shape[1]-N+1
df[df.astype(float).iloc[:,::-1].rank(1,'first').ge(n)]

要为每行保留可使用的前3个值,请执行以下操作:

df = (df * df.astype(float).apply(lambda x: x.isin(x.nlargest(3)), axis=1)).replace('', np.nan)

如果需要,可以将nlargest的参数迁移到变量中

输出:

        day1 day2 day3 day4 day5
larry    NaN    4    4  NaN    5
gunnar   NaN  NaN    3    4    4
tin      NaN    5    5    6    7

相关问题 更多 >