2 回答
TA贡献1887条经验 获得超5个赞
您可以从 year 列中的唯一值创建最近几年的列表,并使用布尔索引来使用该列表索引数据框。
recent_years = df.Year.unique()[-3:]
df[df.Year.isin(recent_years)]
Country Year Value
3 Israel 2001 2.8
4 Denmark 2001 1.1
5 Israel 2002 2.9
6 Congo 2002 3.1
7 Israel 2003 1.9
8 Congo 2003 3.0
9 Denmark 2003 3.1
如果您的 Year 值不一定按顺序排列,请使用 numpy unique 返回排序数组,这与 pandas unique() 不同
recent_years = np.unique(df.Year)[-3:]
df[df.Year.isin(recent_years)]
这是另一个解决方案,它为每个国家/地区返回 3 个最近的年份。如果数据没有按年份排序,则需要先排序。
idx = df.groupby('Country').apply(lambda x: x['Year'].tail(3)).index
df.set_index(['Country', df.index]).reindex(idx).reset_index().drop('level_1', 1)
Country Year Value
0 Congo 2000 1.2
1 Congo 2002 3.1
2 Congo 2003 3.0
3 Denmark 2000 3.1
4 Denmark 2001 1.1
5 Denmark 2003 3.1
6 Israel 2001 2.8
7 Israel 2002 2.9
8 Israel 2003 1.9
如果数据没有排序,首先使用排序
df = df.sort_values(by = 'Year')
TA贡献1884条经验 获得超4个赞
这是我使用 Pandas 的解决方案。即使它使用了很多行代码,它也完成了它必须做的事情。感谢@Vaishali 的帮助:
threshold = 3 #Anything that occurs less than this will be removed,
#if it ocurrs more, the extra ocurrences with the least values
#will be removed.
newIndex = df.set_index('Country')#set new index to make selection by
#index posible.
values = newIndex.index.value_counts() #Count occurrences of index values.
to_keep = values[values>=threshold].index.values
#Keep index values that ocurr >= threshold.
rank_df = newIndex.loc[to_keep,['Value','Year']]#Select rows and
#columns to keep.
#Sort values in descending order before meeting threshold.
rank_df = rank_df.sort_values('Value',ascending=False)
rank_df = rank_df.groupby(rank_df.index).head(threshold)#group again
#Since values are sorted, head() will show highest values
rank_df = rank_df.groupby([rank_df.index,'Year']).mean() \
.sort_values('Value',ascending=False)
#Finally, reset index to convert Year index into a column, and sort by year
rank_df.reset_index(level=1).sort_values('Year')
输出:
Year Value
Country
Denmark 2000 3.1
Israel 2000 2.5
Congo 2000 1.2
Israel 2001 2.8
Denmark 2001 1.1
Congo 2002 3.1
Israel 2002 2.9
Denmark 2003 3.1
Congo 2003 3.0
添加回答
举报