Python 根据特定条件使用 pandas 从数据框中获取值且无重复

Python getting value from dataframe using pandas by specific condition & no duplicates

给定以下数据框,我尝试使用 pandas 仅在“年份”为 2015 - 2020 的情况下提取列“总计”。

    Year  Yield     Total  ...      ExDate     PayDate                  
0   2020  3.09%  0.66  ...  2020-05-12  2020-05-26  
1   2020  3.09%  0.66  ...  2020-05-12  2020-05-26  
2   2019  7.02%   1.5  ...  2019-11-18  2019-11-29   
3   2019  7.02%   1.5  ...  2019-08-05  2019-08-20   
4   2019  7.02%   1.5  ...  2019-05-17  2019-05-31   

如果 2020 年的数据存在,我正在使用的代码有效:

counter = 5
for index, row in df.iterrows():
    if counter == 0:
        break
    if row['Year'] == end + counter:
        print(row['Total'])
        counter -= 1

但如果 2020 年的数据不存在,则没有输出,如下所示:

   Year   Yield  ...     PayDate                   
0  2019   2.00%  ...  2019-05-31  
1  2018   7.87%  ...  2018-09-28     
2  2018   7.87%  ...  2018-06-29  
3  2017  12.27%  ...  2017-09-29       
4  2017  12.27%  ...  2017-05-31     
5  2016   4.67%  ...  2016-09-30

问题:

如何确保代码继续 运行 给出 2019 年至 2015 年的输出,其中 2020 年显示为 'unavailable'?

预期产出(每年一个值 - 无重复):

0.66
1.5
.
.
.

编辑:在你发表评论后,我知道你每年只想要一个。所以定线:

print(df.loc[(df["Year"]>=2015) & (df["Year"]<=2020) ,:].drop_duplicates(subset="Year", keep="First")["Total"].values.tolist())

我没有直接过滤总计列,而是先使用 drop_duplicates 删除所有重复的年份。然后我只过滤总计列的结果。

原答案:

使用 pandas 时,通常只有在极少数情况下,您才需要直接使用 for 循环遍历数据帧。 Pandas 为您提供了很多选项来对整个数据框执行操作,而无需遍历它。

在您的情况下,您希望根据某些条件提取数据。您可以使用 pandas.loc:

来实现
print(df.loc[(df["Year"]>=2015) & (df["Year"]<=2020) , "Total"])

loc 允许您 select 仅基于条件的特定数据。格式为 .loc[rows, columns]。因此,对于行,我使用了一个复杂的条件来确保年份在 2015 年到 2020 年之间。对于您只想过滤“总计”的列。

2020 年是否存在并不重要。它只是过滤所有包含 2015-2020 年的行并查看其中的“总计”列。

另外,我不是很懂你的代码。每次遇到一行时,您都会根据需要从计数器中减少 1。为什么不简单地作为一年内的范围?

for index, row in df.iterrows():
    if row['Year'] >=2015 and row['Year'] <= 2020:
        print(row["Total"])

如果我误解了您的意图(期望的输出),请将您的 post 编辑为 clarift 并告诉我