根据两个属性组合过滤出熊猫数据框

时间:2018-08-16 04:43:19

标签: python pandas dataframe split

我有一个Pandas数据框,其中有足球比赛的例子。有两个属性home_team_nameaway_team_name。两队互相比赛两次,在第一回合中,一支球队回到主场,另一支球队离开,然后情况逆转。一个队名可以在数据集中作为客队或主队出现多次,但与一个特定队组合只能出现两次(一次主场和一次客队)。我想将数据分为两部分。

1498744800,Jun 29 2017 - 2:00pm,complete,8000,Irtysh,Dunav 2010
1498747500,Jun 29 2017 - 2:45pm,complete,15000,Kairat,Atlantas
1499360400,Jul 6 2017 - 5:00pm,complete,5100,Dunav 2010,Irtysh
1499356800,Jul 6 2017 - 4:00pm,complete,1450,Atlantas,Kairat

.csv文件中用于创建数据框的示例。我希望第一个例子一个部分,第二个例子第二个部分。在真实的.csv中,这些示例不是彼此相邻的,这只是为了说明我想要的。在来自.csv的示例中,第一行和第二行将进入第一部分,第三行和第四行将进入第二部分。

在第一部分中将进行第一回合的比赛。

在第二部分中,这些游戏应该有回程。因此,其中home_team_name是第一回合的away_team_name,而away_team_name是第一回合的home_team_name的人。

随时要求更好的解释。

2 个答案:

答案 0 :(得分:1)

这是一种非常规的方法。它涉及组装新的列mash,该对列的每个成员都相同。然后按此列分组并选择前半部分和后半部分:

df = pd.read_table(StringIO("""id,date,done,attendance,home,away
1498744800,Jun 29 2017 - 2:00pm,complete,8000,Irtysh,Dunav 2010
1498747500,Jun 29 2017 - 2:45pm,complete,15000,Kairat,Atlantas
1499360400,Jul 6 2017 - 5:00pm,complete,5100,Dunav 2010,Irtysh
1499356800,Jul 6 2017 - 4:00pm,complete,1450,Atlantas,Kairat
1498744800,July 23 2017 - 2:00pm,complete,8000,Arsenal,Chelsea
1498747500,July 26 2017 - 2:45pm,complete,15000,Wolves,Liverpool
1499360400,Jul 28 2017 - 5:00pm,complete,5100,Liverpool,Wolves
1499356800,Aug 3 2017 - 4:00pm,complete,1450,Chelsea,Arsenal"""), sep=",")
df['mash'] = df.home + df.away
df.mash = df.mash.apply(sorted)
df.mash = df.mash.str.join("")
df.date = df.date.astype('datetime64[ns]')
df = df.sort_values('date')
first_leg_df = df.groupby('mash').first().reset_index(drop=True)
second_leg_df = df.groupby('mash').last().reset_index(drop=True)

第一回合成绩

           id                date      done  attendance     home        away
0  1498744800 2017-06-29 14:00:00  complete        8000   Irtysh  Dunav 2010
1  1498744800 2017-07-23 14:00:00  complete        8000  Arsenal     Chelsea
2  1498747500 2017-06-29 14:45:00  complete       15000   Kairat    Atlantas
3  1498747500 2017-07-26 14:45:00  complete       15000   Wolves   Liverpool

第二条腿结果:

           id                date      done  attendance        home     away
0  1499360400 2017-07-06 17:00:00  complete        5100  Dunav 2010   Irtysh
1  1499356800 2017-08-03 16:00:00  complete        1450     Chelsea  Arsenal
2  1499356800 2017-07-06 16:00:00  complete        1450    Atlantas   Kairat
3  1499360400 2017-07-28 17:00:00  complete        5100   Liverpool   Wolves

答案 1 :(得分:1)

首先用numpy.sort排序值,然后用DataFrame.duplicated创建布尔掩码,最后用boolean indexing过滤,~用于反转布尔掩码:

m = (pd.DataFrame(np.sort(df[['home_team_name','away_team_name']], axis=1), index=df.index)
       .duplicated(keep='last'))
print (m)
0     True
1     True
2    False
3    False
dtype: bool

df1 = df[m]
print (df1)
           id                  date     state    val home_team_name  \
0  1498744800  Jun 29 2017 - 2:00pm  complete   8000         Irtysh   
1  1498747500  Jun 29 2017 - 2:45pm  complete  15000         Kairat   

  away_team_name  
0     Dunav 2010  
1       Atlantas

df2 = df[~m]
print (df2)
           id                 date     state   val home_team_name  \
2  1499360400  Jul 6 2017 - 5:00pm  complete  5100     Dunav 2010   
3  1499356800  Jul 6 2017 - 4:00pm  complete  1450       Atlantas   

  away_team_name  
2         Irtysh  
3         Kairat  

详细信息

print (pd.DataFrame(np.sort(df[['home_team_name','away_team_name']], axis=1), index=df.index))
            0       1
0  Dunav 2010  Irtysh
1    Atlantas  Kairat
2  Dunav 2010  Irtysh
3    Atlantas  Kairat