【问题标题】:Merge two datasets in Pandas在 Pandas 中合并两个数据集
【发布时间】:2017-10-10 02:32:31
【问题描述】:

我以前曾与 Stata 合作过,现在正尝试用 Python 完成同样的工作。但是,我在使用合并命令时遇到了麻烦。不知何故,我一定是错过了什么。我要合并的两个数据框如下所示:

 df1:
 Date id Market_Cap
 2000 1  400
 2000 2  200
 2001 1  410
 2001 2  220

 df2:
 id Ticker
 1   Shell
 2   ExxonMobil

我现在的目标是获取以下数据集:

Date id Market_Cap  Ticker
2000 1  400        Shell 
2000 2  200        ExxonMobil 
2001 1  410        Shell 
2001 2  220        ExxonMobil

我尝试了以下命令:

merged= pd.merge(df1, df2, how="left", on="id")

这合并了数据集,但在 Ticker 列中只给了我 nan。 我查看了几个来源,也许我错了,但是“左”命令不是为了我的目的而做的正确的事情吗?我也试过“对”和“外”。他们没有得到我想要的结果,而且“内在”似乎在这里一般不起作用。

我错过了什么重要的东西吗?

【问题讨论】:

    标签: python pandas merge


    【解决方案1】:

    你的问题是你的列id 在一个df 是object(显然是string)和另一个int,所以没有匹配并得到NaN

    如果有相同的dtypes:

    print (df1['id'].dtypes)
    int64
    print (df2['id'].dtypes)
    int64
    
    merged = pd.merge(df1, df2, how="left", on="id")
    print (merged)
       Date  id  Market_Cap      Ticker
    0  2000   1         400       Shell
    1  2000   2         200  ExxonMobil
    2  2001   1         410       Shell
    3  2001   2         220  ExxonMobil
    

    如果只需要添加一个新列,另一种解决方案是map

    df1['Ticker'] = df1['id'].map(df2.set_index('id')['Ticker'])
    print (df1)
       Date  id  Market_Cap      Ticker
    0  2000   1         400       Shell
    1  2000   2         200  ExxonMobil
    2  2001   1         410       Shell
    3  2001   2         220  ExxonMobil
    

    模拟你的问题:

    print (df1['id'].dtypes)
    object
    print (df2['id'].dtypes)
    int64
    
    df1['Ticker'] = df1['id'].map(df2.set_index('id')['Ticker'])
    print (df1)
       Date id  Market_Cap Ticker
    0  2000  1         400    NaN
    1  2000  2         200    NaN
    2  2001  1         410    NaN
    3  2001  2         220    NaN
    

    解决方案是通过astype 转换为int(或df2 中的列id 转换为str):

    df1['id'] = df1['id'].astype(int)
    #alternatively
    #df2['id'] = df2['id'].astype(str)
    df1['Ticker'] = df1['id'].map(df2.set_index('id')['Ticker'])
    print (df1)
       Date  id  Market_Cap      Ticker
    0  2000   1         400       Shell
    1  2000   2         200  ExxonMobil
    2  2001   1         410       Shell
    3  2001   2         220  ExxonMobil
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-17
      • 2018-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多