Python 基于多种条件过滤数据帧
我的问题是: 我有这样一个数据框:Python 基于多种条件过滤数据帧,python,pandas,time-series,Python,Pandas,Time Series,我的问题是: 我有这样一个数据框: 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
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年,希拉里在美国取得了最好的成绩,因此她将被选中。
泰迪在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
按日期、最佳分数和来自不同国家/地区的两个人进行筛选
sort\u值
+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
您可以使用以下代码按列表分组:
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)
这个输出
Date Name Score Country
0 2012 Hilary 80 USA
1 2012 Paul 45 Mexico
2 2013 Harry 78 UK
3 2013 Silvia 55 Italy
结果
我使用了不同的更长的方法,到目前为止还没有人提交过
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)
这有点费解,但很有效。非常感谢您的帮助,但我想我还不够清楚。我用我正在寻找的结果进行了编辑。更重要的是花一年的时间,拿今年最好的分数,和第一个不同的国家拿第二个最好的分数,希望这对你有帮助谢谢你的帮助,但我想我还不够清楚。我用我正在寻找的结果进行了编辑。这更多的是关于花一年的时间,拿今年最好的分数,拿第二个最好的分数与第一个不同的国家,希望这有助于我挖得更深一点。。。我相信这个解决方案应该适合你。非常感谢你,这也解决了我的问题@YOBEN_有一个简短的解决方案,但我真的很感谢你的帮助非常感谢你的帮助,但我想我还不够清楚。我用我正在寻找的结果进行了编辑。更重要的是花一年的时间,拿今年最好的分数,和第一个不同的国家拿第二个最好的分数,希望这对你有帮助谢谢你的帮助,但我想我还不够清楚。我用我正在寻找的结果进行了编辑。更重要的是要花一年的时间,拿今年最好的分数,在不同的国家和第一个国家拿第二个最好的分数,希望这能有所帮助
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)