我有一个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 的值替换数据帧