Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫找到了最好的匹配&;在表格中显示结果_Python_Pandas_Find - Fatal编程技术网

Python 熊猫找到了最好的匹配&;在表格中显示结果

Python 熊猫找到了最好的匹配&;在表格中显示结果,python,pandas,find,Python,Pandas,Find,我有一个如下所示的数据表,我试图找到1991-2019年到当前年份(2020年)的每一列最接近的匹配。最后,我需要一个如下表,显示查找过程的结果 数据表(daty): 例如,最终结果需要如下所示: index 0 0 soi 2010 1 ao 2009 2 nao 2018 3 pna 2019 4 epo 2011 5 wpo 2011 我曾尝试在这个表单中使用argsort,但我不知道如何在每个列的循环中提取最

我有一个如下所示的数据表,我试图找到1991-2019年到当前年份(2020年)的每一列最接近的匹配。最后,我需要一个如下表,显示查找过程的结果

数据表(daty):

例如,最终结果需要如下所示:

  index     0  
0   soi  2010  
1    ao  2009  
2   nao  2018  
3   pna  2019  
4   epo  2011  
5   wpo  2011  

我曾尝试在这个表单中使用argsort,但我不知道如何在每个列的循环中提取最佳匹配,并在表表单中创建结果<代码>daty.iloc[(daty['soi']-input).abs().argsort()[:1]]。谢谢你的帮助

您可以按如下方式执行此操作:

df.idxmax(axis='index')
对于您的数据集,此计算结果为:

soi    2010
ao     2009
nao    2018
pna    2019
epo    2011
wpo    2011
dtype: int64
为了测试这一点,我根据您的帖子创建了数据帧,如下所示:

from io import StringIO
infile= StringIO(
"""Date  soi     ao   nao   pna       epo       wpo
1990 -0.7 -0.210  1.18 -0.46 -0.285904  0.763053
1991 -1.5 -0.112  0.61  1.15 -0.418762  0.850752
1992  0.1 -0.640 -0.28 -1.13  0.679149 -0.788247
1993 -0.7 -0.361 -0.41 -0.97 -1.228830 -0.447579
1994 -1.6 -0.084 -1.14 -2.02  0.193085 -0.912737
1995  0.3 -0.549  0.45  1.22 -0.658217  0.621721
1996  0.6 -1.140 -0.69 -0.27  0.394934 -1.161684
1997 -1.4  0.195  0.74  0.22  0.138353  0.414802
1998  1.0 -1.050 -1.80  0.42  0.254834  0.563291
1999 -0.1  0.059  0.50  0.33  0.176403  0.587210
2000  0.9  0.395 -0.06 -1.21 -0.303799 -0.809344
2001  0.2 -0.707 -0.49  0.04  0.429597  1.082077
2002 -0.6 -0.043 -0.54  0.60 -0.117497 -0.012490
2003 -0.1  0.467  0.16  0.59  0.172270 -0.503114
2004 -0.3  0.855  0.52 -0.11  0.611507 -0.055418
2005  0.4  0.802  0.76  1.32  0.117412  0.628558
2006 -0.6  0.606 -1.43  0.31 -0.439056 -0.666251
2007  0.2  0.179  0.85  1.52 -0.091188  0.887357
2008  1.2 -0.327  1.14  0.89 -0.146648 -0.444564
2009  0.3  0.875  1.62  1.03  0.747285  0.223464
2010  2.2 -0.865 -0.62  1.07 -0.322557  0.002758
2011  1.0  0.665  0.67 -0.39  1.035278  1.146269
2012  0.2  0.772 -0.43 -0.39 -0.006886  0.560083
2013  0.3 -0.461  0.38  0.41  0.451967  0.600924
2014 -0.7  0.102  1.72  0.78 -0.343152 -0.453856
2015 -1.6 -0.165 -0.49 -0.80  0.394162 -1.161164
2016  1.2  0.781  0.74  0.11  0.104103  0.189280
2017  0.6 -0.492 -0.45 -0.32  0.084595 -0.268721
2018 -0.9  0.585  1.78  1.16 -1.217344 -1.947052
2019 -1.2  0.306 -0.01  1.62 -0.006176  0.676129
2020  0.9  0.631  1.11  0.59 -0.398920 -0.165507"""
)

df= pd.read_fwf(infile).set_index('Date')
你是说:

df.iloc[:-1].sub(df.iloc[-1]).abs().idxmin()
输出:

soi    2000
ao     2006
nao    2008
pna    2003
epo    1991
wpo    2017
dtype: int64

您的问题与输出不匹配。这听起来像是你在试图找到一个年份,每个指数的值都与2020年的值最接近。您只是在显示最大值。您希望的输出是什么?你能改变你问题的措辞或者改变你想要的结果吗?似乎其中一个是错误的。我正在显示最大值出现的年份。这不是问题吗?这为我返回了索引位置
date29 soi 10 ao 16 nao 18 pna 13 epo 1 wpo 27
您是否将
Date
设置为样本数据中显示的索引?不是我的问题,但您只是减轻了我的困惑。非常感谢。我有一个更长的解决方案,但这是这么好。完美的解决方案,虽然我不知道我是否理解它-什么是。sub?那么,idxmin在这里是如何工作的呢?是的,我在大表数据中使用了“Date”作为索引。谢谢大家!@user2100039 sub代表subtract。只是更容易与之连锁。基本上,解决方案是:从每一行(.sub)中减去最后一行,取差值的绝对值(.abs),然后找到每列中最小值的索引(.idxmin)。
soi    2000
ao     2006
nao    2008
pna    2003
epo    1991
wpo    2017
dtype: int64