【问题标题】:Pandas Dataframe and Series join returns empty Dataframe or NaN columnPandas Dataframe 和 Series 连接返回空 Dataframe 或 NaN 列
【发布时间】:2017-08-08 14:36:03
【问题描述】:

我遇到的问题是,当我尝试加入 Dataframe 和 Series 时,由于某种原因,生成的 Dataframe 要么是空的,要么有一列 NaN 值。我试图弄清楚为什么会这样。

系列看起来像这样:

index
110     0.135135
111     0.000000
1110    0.000000

Dataframe 如下所示:

           mean         std
index                        
1101     -41.000000   46.305225
1102     -58.724998  126.810371
1110      -6.375000   12.915982

当我不指定“如何”时,我会得到:

          mean        std             series_col
index                                 
1101     -41.000000   46.305225       NaN
1102     -58.724998   126.810371      NaN
1110      -6.375000   12.915982       NaN

这就是我尝试使用以下方式加入两者的方式:

merged = df1.join(series1, how='inner')

我得到这个输出:

Empty DataFrame
Columns: [mean, std, series_col]
Index: []

我不知道出了什么问题。我认为这一定是一个索引问题,但我确定 Dataframe 和 Series 都有一些相交的索引来匹配数据。

如果我能提供任何其他有用的信息,请告诉我。

【问题讨论】:

    标签: python pandas dataframe merge series


    【解决方案1】:

    当我这样做时,我得到了

    df1.join(series1)
    
               mean         std    1
    1101 -41.000000   46.305225  NaN
    1102 -58.724998  126.810371  NaN
    1110  -6.375000   12.915982  0.0
    

    我猜你的一个索引是字符串,另一个是整数

    【讨论】:

    • 其实你是对的。对于系列,我需要从两列创建索引,每列包含一半的 id 值。我需要它们一个接一个,而不是把它们加在一起,我想不出任何办法,除了把它们串起来。你对我如何解决这个问题有什么建议吗?
    【解决方案2】:

    有问题索引不一样dtypes,所以获取NaN

    解决方案将两个索引都转换为 int 或同时转换为 str 以进行对齐:

    series1.index = series1.index.astype(int)
    df1.index = df1.index.astype(int)
    

    series1.index = series1.index.astype(str)
    df1.index = df1.index.astype(str)
    

    对我来说它返回:

    #inner join
    merged = df1.join(series1, how='inner')
    print (merged)
            mean        std  val
    index                       
    1110  -6.375  12.915982  0.0
    

    #default left join
    merged = df1.join(series1)
    #same as:  
    merged = df1.join(series1, how='left')
    print (merged)
                mean         std  val
    index                            
    1101  -41.000000   46.305225  NaN
    1102  -58.724998  126.810371  NaN
    1110   -6.375000   12.915982  0.0
    

    merged = df1.join(series1, how='outer')
    print (merged)
                mean         std       val
    index                                 
    110          NaN         NaN  0.135135
    1101  -41.000000   46.305225       NaN
    1102  -58.724998  126.810371       NaN
    111          NaN         NaN  0.000000
    1110   -6.375000   12.915982  0.000000
    

    merged = df1.join(series1, how='right')
    print (merged)
            mean        std       val
    index                            
    110      NaN        NaN  0.135135
    111      NaN        NaN  0.000000
    1110  -6.375  12.915982  0.000000
    

    【讨论】:

    • 我认为加入 how='inner' 只会寻找相交的索引并拉出那些行?如果这不是真的,我如何在索引上匹配它们?
    • 是的,确切地说,它只返回intersect 索引。
    • 但问题是存在整数和字符串,请参阅解决方案 - 将两者都转换为 int 或同时转换为 str。
    猜你喜欢
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    • 2017-05-20
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    相关资源
    最近更新 更多