我可以组合groupby数据吗?

时间:2018-06-13 14:14:01

标签: python pandas

我家里有两列。所以一排将是英格兰队对阵巴西队,下一排将是巴西队。我如何统计巴西在一次统计中面临英格兰或英格兰与巴西的比赛?

根据以前的解决方案,我试过

results.groupby(["home_team", "away_team"]).size()
results.groupby(["away_team", "home_team"]).size()

然而,这并没有给我我想要的结果。

不受欢迎的输出: home_team away_team
英格兰巴西1

away_team home_team
巴西英格兰1

我想看到: 英格兰巴西2

3 个答案:

答案 0 :(得分:2)

以下可能是您需要的:

df = pd.DataFrame({
    'home':['England', 'Brazil', 'Spain'],
    'away':['Brazil', 'England', 'Germany']
})

pd.Series('-'.join(sorted(tup)) for tup in zip(df['home'], df['away'])).value_counts()

输出:

Brazil-England    2
Germany-Spain     1
dtype: int64

PS:如果你不喜欢团队名称之间的-,你可以使用:

pd.Series(' '.join(sorted(tup)) for tup in zip(df['home'], df['away'])).value_counts()

答案 1 :(得分:0)

您可以按numpy.sort对值进行排序,创建DataFrame并使用原始解决方案:

df1 = (pd.DataFrame(np.sort(df[['home','away']], axis=1), columns=['home','away'])
        .groupby(["home", "away"])
        .size())

答案 2 :(得分:0)

选项1

您可以使用numpy.sort对数据框的值进行排序 但是,正如那样排序,也许最好创建数据帧的副本。

dfTeams = pd.DataFrame(data=df.values.copy(), columns=['team1','team2'])
dfTeams.values.sort()

(我改变了列名,因为排序你正在改变它们的含义)

完成此操作后,您可以使用groupby

results.groupby(['team1', 'team2']).size()

选项2

由于您的问题的更一般标题将类似于如何计算数据框中多列中值的组合,而不管其顺序,您可以使用set

  

set对象是不同的可哈希对象的无序集合。

更准确地说,创建一个Series个冻结集,然后计算值。

pd.Series(map(lambda home, away: frozenset({home, away}), 
              df['home'], 
              df['away'])).value_counts()

注意:我在@Harv Ipan的回答中使用数据框。