【问题标题】:Working with two data frames with different size in python在python中处理两个不同大小的数据框
【发布时间】:2018-05-23 06:38:02
【问题描述】:

我正在处理两个数据框。 样本数据如下:

DF = ['A','B','C','D','E','A','C','B','B']

DF1 = pd.DataFrame({'Team':DF})

DF2 = pd.DataFrame({'Team':['A','B','C','D','E'],'Rating':[1,2,3,4,5]})

我想向 DF1 添加一个新列,如下所示:

Team       Rating
A             1
B             2
C             3
D             4
E             5
A             1
C             3
B             2
B             2

如何添加新列? 我用过

DF1['Rating']= np.where(DF1['Team']== DF2['Team'],DF2['Rating'],0)

错误:ValueError:只能比较标签相同的系列对象 谢谢 ZEP

【问题讨论】:

    标签: python-3.x pandas


    【解决方案1】:

    我认为需要Series 使用set_index 创建的map,如果不匹配则获取NaNs,因此添加fillna 以替换为0

    DF1['Rating']= DF1['Team'].map(DF2.set_index('Team')['Rating']).fillna(0)
    print (DF1)
      Team  Rating
    0    A       1
    1    B       2
    2    C       3
    3    D       4
    4    E       5
    5    A       1
    6    C       3
    7    B       2
    8    B       2
    

    DF = ['A','B','C','D','E','A','C','B','B', 'G']
    DF1 = pd.DataFrame({'Team':DF})
    
    DF2 = pd.DataFrame({'Team':['A','B','C','D','E'],'Rating':[1,2,3,4,5]})
    
    DF1['Rating']= DF1['Team'].map(DF2.set_index('Team')['Rating']).fillna(0)
    print (DF1)
      Team  Rating
    0    A     1.0
    1    B     2.0
    2    C     3.0
    3    D     4.0
    4    E     5.0
    5    A     1.0
    6    C     3.0
    7    B     2.0
    8    B     2.0
    9    G     0.0 <- G not in DF2['Team']
    

    详情

    print (DF1['Team'].map(DF2.set_index('Team')['Rating']))
    0    1.0
    1    2.0
    2    3.0
    3    4.0
    4    5.0
    5    1.0
    6    3.0
    7    2.0
    8    2.0
    9    NaN
    Name: Team, dtype: float64
    

    【讨论】:

      【解决方案2】:

      你可以使用:

      In [54]: DF1['new_col'] = DF1.Team.map(DF2.set_index('Team').Rating)
      
      In [55]: DF1
      Out[55]: 
        Team  new_col
      0    A        1
      1    B        2
      2    C        3
      3    D        4
      4    E        5
      5    A        1
      6    C        3
      7    B        2
      8    B        2
      

      【讨论】:

        【解决方案3】:

        我认为你可以使用 pd.merge

        DF1=pd.merge(DF1,DF2,how='left',on='Team')
        DF1
        
          Team Rating
        0   A   1
        1   B   2
        2   C   3
        3   D   4
        4   E   5
        5   A   1
        6   C   3
        7   B   2
        8   B   2
        

        【讨论】:

        • 感谢您的建议。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-22
        • 2018-08-21
        • 2019-12-26
        • 2020-05-05
        • 1970-01-01
        • 2021-04-02
        • 1970-01-01
        相关资源
        最近更新 更多