熊猫提高了合并数据框的效率

时间:2018-08-09 19:59:27

标签: python pandas

这是我遇到的问题。

我想用dfTeam中包含的团队名称来映射团队代码(包含在主df中)。

以下是主要df的示例:

              Game Code  Play Number  Period Number  Clock  Offense Team Code
0       690002820050901            1              1  900.0                690   
1       690002820050901            2              1    NaN                 28   
2       690002820050901            3              1    NaN                 28   
3       690002820050901            4              1    NaN                 28   
4       690002820050901            5              1    NaN                 28   
5       690002820050901            6              1    NaN                 28   
6       690002820050901            7              1  826.0                690   
7       690002820050901            8              1    NaN                690   
8       690002820050901            9              1    NaN                690 

我想使用名为Offense Team Code的此数据框使用团队名称来更改诸如dfTeam之类的列。

     Team Code                      Name  Conference Code
0            5                     Akron              875
1            8                   Alabama              911
2            9                       UAB            24312
3           28             Arizona State              905
4           29                   Arizona              905

这是我目前正在做的工作,以合并数据框,更改列名并删除不需要的列:

teamDict = {'Home Team Code':'homeTeamName','Visit Team Code':'visitTeamName','Offense Team Code':'offenseTeamName','Defense Team Code':'defenseTeamName'}
for oldName,newName in teamDict.items():
    dfFULL = pd.merge(dfFULL,dfTeam,how='left',left_on=oldName,right_on='Team Code')
    dfFULL.rename(columns={'Name':newName},inplace=True)
    dfFULL.drop(['Conference Code','Team Code',oldName],axis=1,inplace=True)

此代码有效,但速度很慢。我的主数据帧有130k左右的行。有更有效的方法吗?

1 个答案:

答案 0 :(得分:2)

您基本上想将dfTeam用作将Team Codes映射到Names的字典。对于每一列,您只需执行映射即可。

d = dfTeam.set_index('Team Code').Name
for oldName,newName in teamDict.items():
    dfFULL[newName] = dfFULL[oldName].map(d)

# Then get rid of all old names
dfFull = dfFull.drop(columns=list(teamDict.keys()))