我有一个Pandas数据框,其中有足球比赛的例子。有两个属性home_team_name
和away_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的人。
随时要求更好的解释。
答案 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