返回数据框中最接近用户定义数字的行

Posted

技术标签:

【中文标题】返回数据框中最接近用户定义数字的行【英文标题】:return rows in a dataframe closest to a user-defined number 【发布时间】:2013-07-19 10:38:45 【问题描述】:

我有一个用户定义的数字,我想将它与数据框的某一列进行比较。

我想返回数据帧的行,其中包含(在 df 的某一列中,例如 df.num)与给定数字 x 最接近的 5 个数字。

任何关于没有循环的最佳方法的建议将不胜感激。

【问题讨论】:

【参考方案1】:

我认为你可以使用argsort 方法:

>>> df = pd.DataFrame("A": 1e4*np.arange(100), "num": np.random.random(100))
>>> x = 0.75
>>> df.ix[(df.num-x).abs().argsort()[:5]]
         A       num
66  660000  0.748261
92  920000  0.754911
59  590000  0.764449
27  270000  0.765633
82  820000  0.732601
>>> x = 0.33
>>> df.ix[(df.num-x).abs().argsort()[:5]]
         A       num
37  370000  0.327928
76  760000  0.327921
8    80000  0.326528
17  170000  0.334702
96  960000  0.324516

【讨论】:

假设我们想将其概括为给我们最接近的 5 行(当我们有 n 个输入并且我们想要测量与 n 个不同列的接近度时)。你还会这样做吗?如果 n=2(例如,x=0.75,y=5.0)- 最容易使用 "&" df.ix[(df.num1-x).abs().argsort()[:5] & ( df.num2-y).abs().argsort()[:5]] ?谢谢! pandas 界面变了吗?我需要使用df.iloc 而不是df.ix 否则字段都是NaN 啊,我认为问题出在我的 df 索引上,它不是像 range(len(df)) 这样的序列。 iloc 但是似乎可以同时使用“正常”索引和我的索引。我对 pandas 不是很有经验,但这种行为表明使用 iloc 会更稳定? 这是错误的。您需要执行 .argsort().index 来处理您的索引可能无法方便地从 0 变为 N-1 的情况。【参考方案2】:

对 python 和 pandas 有点陌生,但我建议这样做。

#make random df and get number
df = pd.DataFrame('c1':0,'c2':np.random.random(100))
x = .25
#find differences and sort
diff = df.c2.apply(lambda z: abs(x-z))
diff.sort()
#get the index for the 5 closest numbers
inds = diff.index[:5]

inds 然后将具有来自原始 df 的 5 个最接近数字的索引位置。希望这会有所帮助!

【讨论】:

以上是关于返回数据框中最接近用户定义数字的行的主要内容,如果未能解决你的问题,请参考以下文章

C++:查找数组中最接近的值

熊猫应用函数将多个值返回到熊猫数据框中的行

对分组的熊猫数据框中的行求和并返回 NaN

在使用数字列表搜索列后返回数据框中的所有行 - Python/Pandas

使用 R 中的多参数用户定义函数将列添加到数据框中

返回r数据框中特定行的上下行