如果范围值为true,则获取名称Python



我有一个pandas问题,关于如果X列中的值范围为true,则获取名称如果年份在1960年到现在的十年内,请打印名称因此,下面是我的数据帧示例:

#,Name,description,year
1,a,foo,1961
2,a,foo2,1977
3,a,foo3,1980
4,a,foo4,1995
5,a,foo5,2001
6,a,foo6,2011
7,a,foo7,2020
8,b,bar,1965
9,b,bar2,1970
10,b,bar3,1983
11,b,bar4,1997
12,b,bar5,2005
13,b,bar6,2016
14,b,bar7,2022
15,c,abc,1965
16,c,ab2,1970
17,c,abc3,1993
18,c,abc4,2007
19,c,abc5,2015
20,c,abc6,2020

输出:a,b

到目前为止,我做到了:

dataset[Year].str.match(str(year[0:3]))

我想我需要一个for循环,但我一点也不确定。谢谢你的帮助!

解决问题的一种方法是使用Pandas groupby方法创建组然后使用Pandas滤波方法对组进行滤波。

import pandas as pd

def is_within_range(group):
years = sorted(list(group["Year"]))
check_decade = {}
for year in years:
decade = year // 10
if 196 <= decade <= 202:
check_decade[decade] = True
if len(check_decade.keys()) == (202 - 196 + 1):
return True
return False

data = pd.read_csv("years.csv")
filtered_data = data.groupby(['Name']).filter(lambda x: is_within_range(x))
print(list(filtered_data.Name.unique()))

输出:

['a', 'b']

years.csv:

#,Name,Description,Year
1,a,foo,1961
2,a,foo2,1977
3,a,foo3,1980
4,a,foo4,1995
5,a,foo5,2001
6,a,foo6,2011
7,a,foo7,2020
8,b,bar,1965
9,b,bar2,1970
10,b,bar3,1983
11,b,bar4,1997
12,b,bar5,2005
13,b,bar6,2016
14,b,bar7,2022
15,c,abc,1965
16,c,ab2,1970
17,c,abc3,1993
18,c,abc4,2007
19,c,abc5,2015
20,c,abc6,2020

解释:

  • is_with_range方法检查一个组是否有1960年至2020年的每十年的年份。一年中的十年是year // 10。例如,1965年和1969年的十年值为196,而1996年和1998年的十年间值为199
  • 我用字典将每个十年标记为True,然后计算组中的十年数

参考文献:

  • Pandas关于数据帧分组的文档
  • 关于数据帧过滤器的Pandas文档

您可以使用dataframe.query方法来执行与dataset.query相同的操作("年份">=1961,inplace=True(print(dataset(#它用年份大于1961 的值替换数据帧

最新更新