Python通过特定条件使用pandas从数据帧获取值&无重复项

2024-09-28 20:41:16 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑到下面的数据框架,我试图使用pandas来提取列“Total”,其中“Year”是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年显示为“不可用”

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

0.66
1.5
.
.
.

Tags: 数据代码in框架pandasforindexif
1条回答
网友
1楼 · 发布于 2024-09-28 20:41:16

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

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

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

原始答复:

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

在本例中,您希望根据某些条件提取数据。您可以使用pandas.loc实现这一点:

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

loc允许您根据条件仅选择特定数据。格式为.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"])

如果我误解了你的意图(期望的输出),请编辑你在clarift的帖子并让我知道

相关问题 更多 >