Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.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_Dataframe - Fatal编程技术网

Python 基于其他列的计数添加列

Python 基于其他列的计数添加列,python,pandas,dataframe,Python,Pandas,Dataframe,我有以下包含体育比赛信息的熊猫数据框: tournament playerA playerB 1 A B 1 C B 1 D A 2 A B 2 A C 2 A D 现在我想添加一个新的列(或者创建一个新的数据框;任何更容易实现的)

我有以下包含体育比赛信息的熊猫数据框:

tournament    playerA    playerB
1             A          B 
1             C          B
1             D          A
2             A          B
2             A          C
2             A          D
现在我想添加一个新的列(或者创建一个新的数据框;任何更容易实现的),其中包含关于每个锦标赛有多少玩家参加的信息。参与的玩家是playerA和playerB列的集合(无重复)

如果添加了一个新列,新的数据帧应该如下所示(锦标赛1有4名玩家参与,即a、B、C和D;锦标赛2有3名玩家参与,即a、B和C):

如果更容易创建新的数据帧,则可以/应该如下所示:

tournament    players_sum
1             4
2             3
到目前为止我一直在尝试:我尝试了
groupby()
,然后尝试了
apply()
transform()
,但是我不知道如何合并两列(playerA和playerB)的信息


谢谢,非常感谢您的帮助。

为此,我将为
unique()
锦标赛和玩家值创建一个字典,然后将其映射到新列

tourneys = df['tournament'].unique()
player_dict = {}
for event in tourneys:
    ndf = df[df['tournament'] == event].copy()
    player_dict[event] = len(ndf['playerA'].append(ndf['playerB']).unique())

df['player_sum'] = df['tournament'].map(player_dict)
df


同时,我也找到了一个解决方案,我想在这里发布:

def myfunc(group):
    w_set = set(group['playerA'])
    l_set = set(group['playerB'])
    group['player_sum'] = len(w_set.union(l_set))
    return group

df = df.reset_index().groupby('tournament').apply(myfunc)
  playerA playerB  tournament  player_sum
0       A       B           1           4
1       C       B           1           4
2       D       A           1           4
3       A       B           2           3
4       A       C           2           3
def myfunc(group):
    w_set = set(group['playerA'])
    l_set = set(group['playerB'])
    group['player_sum'] = len(w_set.union(l_set))
    return group

df = df.reset_index().groupby('tournament').apply(myfunc)