【问题标题】:Combining two Series into a DataFrame in pandas在熊猫中将两个系列组合成一个DataFrame
【发布时间】:2013-08-06 09:28:16
【问题描述】:

我有两个系列 s1s2 具有相同(非连续)索引。如何将 s1s2 组合为 DataFrame 中的两列并将其中一个索引保留为第三列?

【问题讨论】:

    标签: python pandas series dataframe


    【解决方案1】:

    如果您尝试加入长度相等的系列,但它们的索引不匹配(这是一种常见情况),那么将它们连接起来会在它们不匹配的地方生成 NA。

    x = pd.Series({'a':1,'b':2,})
    y = pd.Series({'d':4,'e':5})
    pd.concat([x,y],axis=1)
    
    #Output (I've added column names for clarity)
    Index   x    y
    a      1.0  NaN
    b      2.0  NaN
    d      NaN  4.0
    e      NaN  5.0
    

    假设您不关心索引是否匹配,解决方案是在连接它们之前重新索引两个系列。如果 drop=False 是默认值,那么 Pandas 会将旧索引保存在新数据帧的列中(为简单起见,此处删除了索引)。

    pd.concat([x.reset_index(drop=True),y.reset_index(drop=True)],axis=1)
    
    #Output (column names added):
    Index   x   y
    0       1   4
    1       2   5
    

    【讨论】:

      【解决方案2】:

      我使用 pandas 将我的 numpy 数组或 iseries 转换为数据框,然后通过键添加和附加附加列作为“预测”。如果您需要将数据框转换回列表,请使用 values.tolist()

      output=pd.DataFrame(X_test)
      output['prediction']=y_pred
      
      list=output.values.tolist()     
      

      【讨论】:

        【解决方案3】:

        如果我可以回答这个问题。

        将序列转换为数据框的基本原理是理解这一点

        1.在概念层面,数据框中的每一列都是一个系列。

        2.而且,每个列名都是映射到一个系列的键名。

        如果您牢记以上两个概念,您可以想到许多将系列转换为数据框的方法。 一个简单的解决方案是这样的:

        在这里创建两个系列

        import pandas as pd
        
        series_1 = pd.Series(list(range(10)))
        
        series_2 = pd.Series(list(range(20,30)))
        

        使用所需的列名创建一个空数据框

        df = pd.DataFrame(columns = ['Column_name#1', 'Column_name#1'])
        

        使用映射概念将序列值放入数据框中

        df['Column_name#1'] = series_1
        
        df['Column_name#2'] = series_2
        

        立即查看结果

        df.head(5)
        

        【讨论】:

          【解决方案4】:

          如果两者具有相同的索引,为什么不直接使用 .to_frame?

          >= v0.23

          a.to_frame().join(b)
          

          v0.23

          a.to_frame().join(b.to_frame())
          

          【讨论】:

          • 也许这样更合适:a.to_frame(name = 'a').join(b.to_frame(name='b'))
          【解决方案5】:

          基于join()的解决方案的简化:

          df = a.to_frame().join(b)
          

          【讨论】:

            【解决方案6】:

            不确定我是否完全理解您的问题,但这是您想要做的吗?

            pd.DataFrame(data=dict(s1=s1, s2=s2), index=s1.index)
            

            (这里甚至不需要index=s1.index

            【讨论】:

              【解决方案7】:

              我认为concat 是一个很好的方法。如果它们存在,它将使用 Series 的 name 属性作为列(否则它只是对它们进行编号):

              In [1]: s1 = pd.Series([1, 2], index=['A', 'B'], name='s1')
              
              In [2]: s2 = pd.Series([3, 4], index=['A', 'B'], name='s2')
              
              In [3]: pd.concat([s1, s2], axis=1)
              Out[3]:
                 s1  s2
              A   1   3
              B   2   4
              
              In [4]: pd.concat([s1, s2], axis=1).reset_index()
              Out[4]:
                index  s1  s2
              0     A   1   3
              1     B   2   4
              

              注意:这扩展到超过 2 个系列。

              【讨论】:

              • 这实际上也避免了复制(与 dict 解决方案相比)
              • 在一个实例中,它似乎在告诉我“ValueError:具有多个元素的数组的真值是模棱两可的。使用 a.any() 或 a.all()' - 有什么想法吗?
              • @user7289 不确定这是从哪里来的,你能问这个问题吗?
              • @AndyHayden:如果一个或两个索引上有重复项怎么办?
              • @dafininguzman “不断地重用这个函数”的意思是你应该更喜欢 concat once pd.concat([list_of_dataframes]) vs concating 多次 new_df = pd.DataFrame(); for df in list_of_dsf: new_df = pd.concat([new_df, df]) 或类似的。
              【解决方案8】:

              Pandas 会自动对齐这些传入的序列并创建联合索引 他们碰巧在这里是一样的。 reset_index 将索引移动到一列。

              In [2]: s1 = Series(randn(5),index=[1,2,4,5,6])
              
              In [4]: s2 = Series(randn(5),index=[1,2,4,5,6])
              
              In [8]: DataFrame(dict(s1 = s1, s2 = s2)).reset_index()
              Out[8]: 
                 index        s1        s2
              0      1 -0.176143  0.128635
              1      2 -1.286470  0.908497
              2      4 -0.995881  0.528050
              3      5  0.402241  0.458870
              4      6  0.380457  0.072251
              

              【讨论】:

              • np.random.randn(5)
              【解决方案9】:

              示例代码:

              a = pd.Series([1,2,3,4], index=[7,2,8,9])
              b = pd.Series([5,6,7,8], index=[7,2,8,9])
              data = pd.DataFrame({'a': a,'b':b, 'idx_col':a.index})
              

              Pandas 允许您从 dict 创建一个 DataFrame,其中 Series 作为值,列名作为键。当它找到Series 作为值时,它使用Series 索引作为DataFrame 索引的一部分。这种数据对齐是 Pandas 的主要优势之一。因此,除非您有其他需求,否则新创建的 DataFrame 具有重复值。在上面的示例中,data['idx_col']data.index 具有相同的数据。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2014-10-20
                • 1970-01-01
                • 2013-08-07
                • 1970-01-01
                • 1970-01-01
                • 2020-09-07
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多