通过在Dictionary中查找值将新列添加到Dataframe

时间:2015-10-02 15:01:58

标签: python pandas transform apply lookup

我有一个Pandas数据框,每个锦标赛的运动成绩如下(简化):

Tournament  WinnerName  LoserName
t1          A           X
t1          B           Y
t1          C           Y
t2          A           X
t2          B           Y
t2          C           Y

在字典中,我有关于每场比赛球员排名的信息:

Tournament  Player  Rank
t1          A       1
t1          B       7
t1          C       70
t2          A       11
t2          B       1
t2          C       100

现在我想知道每场比赛比赛的胜利者在以下其中一个类别中排名:a)介于1和10之间,b)介于11和49之间,c)大于49。

所以结果可能是这样的:

Tournament  WinnerName  LoserName   Group
t1          A           X           a
t1          B           Y           a
t1          C           Y           c
t2          A           X           b
t2          B           Y           a
t2          C           Y           c

或者像这样:

Tournament  WinnerName  LoserName   GroupA  GroupB  GroupC
t1          A           X           1       0       0
t1          B           Y           1       0       0
t1          C           Y           0       0       1
t2          A           X           0       1       0
t2          B           Y           1       0       0
t2          C           Y           0       0       1

之后,我可以轻松计算每列的出现次数。但目前我无法实现两个给定结果中的一个。我知道它应该以某种方式与applytransform一起工作,但不幸的是我没有确切的想法。 也许甚至有更好的解决方案来实现这个目标?

谢谢。

1 个答案:

答案 0 :(得分:0)

从Rank(列)中你可以剪切和get_dummies:

In [11]: r
Out[11]:
0      1
1      7
2     70
3     11
4      1
5    100
Name: Rank, dtype: int64

In [12]: pd.cut(r, [0, 10, 49, 100], include_lowest=True)
Out[12]:
0      [0, 10]
1      [0, 10]
2    (49, 100]
3     (10, 49]
4      [0, 10]
5    (49, 100]
Name: Rank, dtype: category
Categories (3, object): [[0, 10] < (10, 49] < (49, 100]]

In [13]: pd.get_dummies(pd.cut(r, [0, 10, 49, 100], include_lowest=True))
Out[13]:
   [0, 10]  (10, 49]  (49, 100]
0        1         0          0
1        1         0          0
2        0         0          1
3        0         1          0
4        1         0          0
5        0         0          1

现在,您可以使用原始数据框加入/不论这些内容。