根据多个条件筛选数据框

3

以下是需要翻译的内容:

这是我的问题:

我有一个数据框,长这样:

Date  Name  Score  Country
2012  Paul    45    Mexico
2012  Mike    38    Sweden
2012  Teddy   62    USA 
2012  Hilary  80    USA 
2013  Ashley  42    France 
2013  Temari  58    UK 
2013  Harry   78    UK
2013  Silvia  55    Italy

我想选择两个最好的分数,按日期过滤并且来自不同的国家。
例如在这里:2012年,Hilary获得了最高的分数(来自美国),因此她将被选中。 Teddy在2012年获得了第二好的成绩,但他不会被选中,因为他来自同一个国家(美国)。 因此,保罗将被选中,因为他来自另一个国家(墨西哥)。
这是我所做的:
df = pd.DataFrame(
    {'Date':["2012","2012","2012","2012","2013","2013","2013","2013"],
     'Name': ["Paul", "Mike", "Teddy", "Hilary", "Ashley", "Temaru","Harry","Silvia"],
     'Score': [45, 38, 62, 80, 42, 58,78,55],
     "Country":["Mexico","Sweden","USA","USA","France","UK",'UK','Italy']})

然后我按照日期和分数制作了筛选器:

df1 = df.set_index('Name').groupby('Date')['Score'].apply(lambda grp: grp.nlargest(2))

但我不是很确定如何筛选出来自不同国家的内容。

有没有人有这方面的想法?非常感谢。

编辑:我需要的答案应该像这样:

Date  Name  Score  Country
2012  Hilary  80    USA 
2012  Paul    45    Mexico
2013  Harry   78    UK
2013  Silvia  55    Italy

按日期、最佳得分和不同国家筛选两个人。

4个回答

2

sort_values + tail

s=df.sort_values('Score').drop_duplicates(['Date','Country'],keep='last').groupby('Date').tail(2)
s
   Date    Name  Score Country
0  2012    Paul     45  Mexico
7  2013  Silvia     55   Italy
6  2013   Harry     78      UK
3  2012  Hilary     80     USA

非常感谢您的帮助,但我认为我没有表达清楚。我进行了编辑,说明了我想要的结果。更多地是关于取一年中最好的成绩,以及与第一个国家不同的第二个最佳成绩,希望这有所帮助。 - Kben59

1
您可以使用以下代码按列表分组:

df1 = df.set_index('Name').groupby(['Date', 'Country'])['Score'].apply(lambda grp: grp.nlargest(1))

它将输出以下内容:

它将输出这个:

Date  Country  Name     Score
2012  Mexico   Paul      45
      Sweden   Mike      38
      USA      Hilary    80
2013  France   Ashley    42
      Italy    Silvia    55
      UK       Harry     78

编辑:

基于新的信息,这里提供一种解决方案。它可能还可以进一步改进,但是已经可行。

df.sort_values(['Score'],ascending=False, inplace=True)
df.sort_values(['Date'], inplace=True)
df.drop_duplicates(['Date', 'Country'], keep='first', inplace=True)
df1 = df.groupby('Date').head(2).reset_index(drop=True)

This outputs

   Date    Name  Score Country
0  2012  Hilary     80     USA
1  2012    Paul     45  Mexico
2  2013   Harry     78      UK
3  2013  Silvia     55   Italy

非常感谢您的帮助,但我认为我没有表达清楚。我进行了编辑,说明了我想要的结果。更多地是关于取一年中最好的成绩,以及与第一个国家不同的第二个最佳成绩,希望这有所帮助。 - Kben59
我深入研究了一下... 我相信这个解决方案应该适用于你。 - John Schank
非常感谢,这也解决了我的问题。@YOBEN_S 的解决方案稍微简短一些,但是我真的很感激你的帮助。 - Kben59

0
df.groupby(['Country','Name','Date'])['Score'].agg(Score=('Score','first')).reset_index().drop_duplicates(subset='Country', keep='first')

结果

enter image description here


非常感谢您的帮助,但我觉得我的表述不够清楚。我做了一次编辑,标明了我想要的结果。这更多地涉及到选取一年中最好的成绩,并选取来自第一个国家不同的第二好成绩,希望这有所帮助。 - Kben59

0

我使用了不同的更长的方法,迄今为止没有人提交过。

df = pd.DataFrame(
    {'Date':["2012","2012","2012","2012","2013","2013","2013","2013"],
     'Name': ["Paul", "Mike", "Teddy", "Hilary", "Ashley", "Temaru","Harry","Silvia"],
     'Score': [45, 38, 62, 80, 42, 58,78,55],
     "Country":["Mexico","Sweden","USA","USA","France","UK",'UK','Italy']})

df1=df.groupby(['Date','Country'])['Score'].max().reset_index()

df2=df.iloc[:,[1,2]]

df1.merge(df2)

这有点复杂,但能完成工作。


非常感谢您的帮助,但我认为我表达得不够清楚。我进行了编辑,说明了我想要的结果。更多地是关于取一年中最好的成绩,以及与第一个国家不同的第二个最佳成绩,希望这有所帮助。 - Kben59

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接