Pandas 在 Table 中找到最佳匹配并显示结果
Pandas Find Best Match & Show Result in Table
我有一个数据 table,如下所示,我试图找到 1991-2019 年每一列与当前年份(2020 年)最接近的匹配项。最后,我需要一个如下所示的 table 来显示查找过程的结果。
数据table(日期):
soi ao nao pna epo wpo
Date
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
例如,最终结果需要如下所示:
index 0
0 soi 2010
1 ao 2009
2 nao 2018
3 pna 2019
4 epo 2011
5 wpo 2011
我试过以这种形式使用 argsort,但我不知道如何在每个列的循环中提取最佳匹配并以 table 形式创建结果。 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
为了对此进行测试,我根据您的 post 创建了数据框,例如:
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
我有一个数据 table,如下所示,我试图找到 1991-2019 年每一列与当前年份(2020 年)最接近的匹配项。最后,我需要一个如下所示的 table 来显示查找过程的结果。
数据table(日期):
soi ao nao pna epo wpo
Date
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
例如,最终结果需要如下所示:
index 0
0 soi 2010
1 ao 2009
2 nao 2018
3 pna 2019
4 epo 2011
5 wpo 2011
我试过以这种形式使用 argsort,但我不知道如何在每个列的循环中提取最佳匹配并以 table 形式创建结果。 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
为了对此进行测试,我根据您的 post 创建了数据框,例如:
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