Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于多种条件过滤数据帧_Python_Pandas_Time Series - Fatal编程技术网

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)