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 并告诉我
给定以下数据框,我尝试使用 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 并告诉我