python - 如何在数据框中保留唯一的前 N 个值
问题描述
它是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:只保留前 n 个值并将其他值设置为 0,但我只需要保留 N 个最高可用值,否则平均值不正确
对于上面的结果,我只想保留5
第一
解决方案
您可以使用np.unique
排序并找到第 5 个最大值,然后使用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
推荐阅读
- javascript - Bootstrap modal 通过 js bug 关闭
- angular - Angular 递归 HTTP 请求,组合响应,最终返回单个 observable
- python - 当保存为字符串时,CSV 阅读器将数字转换为小数
- delphi - SetWindowPlacement 有时会因最大化窗口而失败
- tensorflow - 无法在 tensorflow r1.14 中导入“tensorflow.contrib.tensorrt”
- r - 如何在 igraph 中为 R 置换网络?
- kubernetes - 如何通过 terraform 在新配置的 EKS 集群上修复 kubernetes_config_map 资源错误?
- docker - docker:从另一个容器观察容器日志/stdout/stderr?
- sql - 计算每个相关值的每个季度的平均值
- azure-active-directory - 忘记登录帐户 AzureAD MSAL