【问题标题】:Convert pandas data frame to series将熊猫数据框转换为系列
【发布时间】:2016-01-19 17:02:20
【问题描述】:

我对熊猫有点陌生。我有一个 1 行 x 23 列的 pandas 数据框。

我想把它转换成一个系列?我想知道最pythonic的方法是什么?

我试过pd.Series(myResults),但它抱怨ValueError: cannot copy sequence with size 23 to array axis with dimension 1。意识到它仍然是数学术语中的“向量”还不够聪明。

谢谢!

【问题讨论】:

    标签: python pandas dataframe series


    【解决方案1】:

    意识到它仍然是数学术语中的“向量”还不够聪明。

    不如说它足够聪明,可以识别维度上的差异。 :-)

    我认为您可以做的最简单的事情是使用iloc 在位置上选择该行,这会为您提供一个系列,其中列作为新索引,值作为值:

    >>> df = pd.DataFrame([list(range(5))], columns=["a{}".format(i) for i in range(5)])
    >>> df
       a0  a1  a2  a3  a4
    0   0   1   2   3   4
    >>> df.iloc[0]
    a0    0
    a1    1
    a2    2
    a3    3
    a4    4
    Name: 0, dtype: int64
    >>> type(_)
    <class 'pandas.core.series.Series'>
    

    【讨论】:

    • 或者,另一种方式:df.T
    • @ako: df.T 不会产生一个系列,但只是一个转置的数据帧。
    • @DSM。没错,df.T.iloc[0]
    • 使用df.iloc 的唯一问题是,如果您有一个空的df,这将引发IndexError。为避免这种情况,在转置 df 后,请使用 df.squeeze 方法。参考。到pandas.pydata.org/pandas-docs/stable/reference/api/…
    【解决方案2】:

    您可以使用以下两种方法之一通过对数据框进行切片来检索系列:

    http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.iloc.html http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.loc.html

    import pandas as pd
    import numpy as np
    df = pd.DataFrame(data=np.random.randn(1,8))
    
    series1=df.iloc[0,:]
    type(series1)
    pandas.core.series.Series
    

    【讨论】:

      【解决方案3】:

      您可以转置单行数据帧(仍会生成数据帧),然后将squeeze 的结果转换为系列(to_frame 的倒数)。

      df = pd.DataFrame([list(range(5))], columns=["a{}".format(i) for i in range(5)])
      
      >>> df.squeeze(axis=0)
      a0    0
      a1    1
      a2    2
      a3    3
      a4    4
      Name: 0, dtype: int64
      

      注意:为了适应@IanS 提出的观点(即使它不在 OP 的问题中),请测试数据框的大小。我假设df 是一个数据框,但边缘情况是一个空数据框、一个形状为 (1, 1) 的数据框和一个具有多行的数据框,在这种情况下,使用应该实现其所需的功能。

      if df.empty:
          # Empty dataframe, so convert to empty Series.
          result = pd.Series()
      elif df.shape == (1, 1)
          # DataFrame with one value, so convert to series with appropriate index.
          result = pd.Series(df.iat[0, 0], index=df.columns)
      elif len(df) == 1:
          # Convert to series per OP's question.
          result = df.T.squeeze()
      else:
          # Dataframe with multiple rows.  Implement desired behavior.
          pass
      

      这也可以按照@themachinist 提供的答案进行简化。

      if len(df) > 1:
          # Dataframe with multiple rows.  Implement desired behavior.
          pass
      else:
          result = pd.Series() if df.empty else df.iloc[0, :]
      

      【讨论】:

      • 请注意,我在使用 squeeze 时遇到了一个小问题。对于形状为(1, 1) 的数据框,它将返回的不是一系列长度为 1 的数据,而是一个 numpy 标量。这导致在对长度未知的对象(例如,groupby)使用 squeeze 时难以发现错误。
      • "谢谢!当 df.iloc[:,0] 和 df.ix[:,0] 都产生了太多索引错误时,df.squeeze() 起作用了"
      • 为什么to_frame 的倒数不是to_seriespd.Series(df) ...?
      • 你不需要.T
      • @IanS 传递参数 df.squeeze(axis=0)df.squeeze(axis=1)(取决于您要保存的轴)以避免这种情况
      【解决方案4】:

      另一种方式-

      假设 myResult 是包含 1 列和 23 行形式的数据的数据帧

      # label your columns by passing a list of names
      myResult.columns = ['firstCol']
      
      # fetch the column in this way, which will return you a series
      myResult = myResult['firstCol']
      
      print(type(myResult))
      

      以类似的方式,您可以从 Dataframe 中获取具有多列的系列。

      【讨论】:

        【解决方案5】:
        data = pd.DataFrame({"a":[1,2,3,34],"b":[5,6,7,8]})
        new_data = pd.melt(data)
        new_data.set_index("variable", inplace=True)
        

        这给出了一个数据框,其索引作为数据的列名,所有数据都存在于“值”列中

        【讨论】:

        • 欢迎来到 Stack Overflow!这如何回答这个问题?您的代码不会像问题所要求的那样返回系列
        【解决方案6】:

        你也可以使用stack()

        df= DataFrame([list(range(5))], columns = [“a{}”.format(I) for I in range(5)])
        

        你运行df之后,然后运行:

        df.stack()
        

        你获得你的数据帧系列

        【讨论】:

        • stack() 是唯一足够强大的解决方案,不会返回单个元素而不是预期的单个列...
        【解决方案7】:

        如果您有一个单列数据框 df,则可以将其转换为系列:

        df.iloc[:,0]  # pandas Series
        

        由于您有一个单行数据框df,因此您可以将其转置为前一种情况:

        df.T.iloc[:,0]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-10-12
          • 1970-01-01
          • 2020-09-10
          • 2021-12-08
          • 2021-12-18
          • 2017-08-26
          相关资源
          最近更新 更多