【问题标题】:Pandas, concat Series to DF as rows熊猫,将系列连接到DF作为行
【发布时间】:2014-01-27 02:31:12
【问题描述】:

我试图将一个系列添加到一个空的 DataFrame 并且找不到答案 在文档或其他问题中。由于您可以按行附加两个 DataFrame 或按列,似乎系列中必须缺少“轴标记”。能 任何人解释为什么这不起作用?。

import Pandas as pd
df1 = pd.DataFrame()
s1 = pd.Series(['a',5,6])
df1 = pd.concat([df1,s1],axis = 1)
#go run some process return s2, s3, sn ...
s2 = pd.Series(['b',8,9])
df1 = pd.concat([df1,s2],axis = 1)
s3 = pd.Series(['c',10,11])
df1 = pd.concat([df1,s3],axis = 1)

如果我上面的示例具有误导性,使用文档中的示例可能会有所帮助。

引用:将行附加到 DataFrame。
虽然不是特别有效(因为必须创建一个新对象),但您可以附加一个 通过将 Series 或 dict 传递给附加的单行到 DataFrame,这将返回一个新的 DataFrame,如上所示。结束引用。

文档中的示例附加了“S”,它是 DataFrame 中的一行,“S1”是一个系列 并尝试附加“S1”会产生错误。我的问题是为什么会附加“S1 不起作用?问题背后的假设是 DataFrame 必须编码或包含两个轴的轴信息,而 Series 必须只包含一个轴的信息。

df = pd.DataFrame(np.random.randn(8, 4), columns=['A','B','C','D'])
s = df.xs(3); #third row of DataFrame
s1 = pd.Series([np.random.randn(4)]); #new Series of equal len
df= df.append(s, ignore_index=True)

结果

   0  1

0  a  b

1  5  8

2  6  9

想要的

   0  1 2

0  a  5 6

1  b  8 9

【问题讨论】:

    标签: python pandas concat series


    【解决方案1】:

    你很接近,只是将concat的结果转置

    In [14]: s1
    Out[14]: 
    0    a
    1    5
    2    6
    dtype: object
    
    In [15]: s2
    Out[15]: 
    0    b
    1    8
    2    9
    dtype: object
    
    In [16]: pd.concat([s1, s2], axis=1).T
    Out[16]: 
       0  1  2
    0  a  5  6
    1  b  8  9
    
    [2 rows x 3 columns]
    

    您也不需要创建空的DataFrame

    【讨论】:

    • Tom,使用你的答案,如果我现在想将另一个系列连接到我得到的结果:AttributeError: 'Series' object has no attribute '_data'
    • 您能否编辑您的问题以显示您想要连接的第三个系列?如果你和s1s2同时拥有,可以做`pd.concat([s1, s2, s3],axis=1).T
    • 问题请看编辑版,concat操作不会同时发生。
    • 出于好奇,有没有办法以不需要转置的方式调用pd.concat?
    • @ItamarMushkin 使用 pandas.DataFrame 构造函数,请参阅 stackoverflow.com/a/69810437/1280629
    【解决方案2】:

    最好的方法是使用DataFrame从Series序列构造一个DF,而不是使用concat:

    import pandas as pd
    s1 = pd.Series(['a',5,6])
    s2 = pd.Series(['b',8,9])
    pd.DataFrame([s1, s2])
    

    输出:

    In [4]: pd.DataFrame([s1, s2])
    Out[4]: 
       0  1  2
    0  a  5  6
    1  b  8  9
    

    【讨论】:

      【解决方案3】:

      实现与将 Series 附加到 DataFrame 相同目标的方法 是将数据转换为列表数组并将数组附加到DataFrame。

      作为列表数组的数据

      def get_example(idx):

         list1 = (idx+1,idx+2 ,chr(idx + 97))
         data = [list1]
         return(data)
      

      df1 = pd.DataFrame()

      对于范围内的 idx(4):

         data = get_example(idx)
         df1= df1.append(data, ignore_index = True)
      

      【讨论】:

        猜你喜欢
        • 2021-08-18
        • 2019-07-19
        • 1970-01-01
        • 2021-04-30
        • 1970-01-01
        • 1970-01-01
        • 2017-09-15
        • 2016-01-25
        • 1970-01-01
        相关资源
        最近更新 更多