将pandas数据框转换为系列

use*_*015 70 python series dataframe pandas

我对熊猫有点新鲜.我有一个1行乘23列的pandas数据框.

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

我试过了,pd.Series(myResults)但它抱怨ValueError: cannot copy sequence with size 23 to array axis with dimension 1.要理解它仍然是数学术语中的"载体",这还不够智能.

谢谢!

DSM*_*DSM 49

要理解它仍然是数学术语中的"载体",这还不够智能.

更确切地说,它足够聪明,可以识别维度的差异.:-)

我认为你能做的最简单的事情是选择行位置使用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'>
Run Code Online (Sandbox Code Playgroud)

  • @ako:`df.T`不会生成一个系列,只是一个转置的DataFrame. (6认同)
  • 或者,另一种方式:`df.T` (2认同)

Ale*_*der 44

您可以转置单行数据帧(仍然会生成数据帧),然后结果压缩成一系列(反之to_frame).

df = pd.DataFrame([list(range(5))], columns=["a{}".format(i) for i in range(5)])

>>> df.T.squeeze()  # Or more simply, df.squeeze() for a single row dataframe.
a0    0
a1    1
a2    2
a3    3
a4    4
Name: 0, dtype: int64
Run Code Online (Sandbox Code Playgroud)

注意:为了适应@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
Run Code Online (Sandbox Code Playgroud)

这也可以根据@themachinist提供的答案简化.

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

  • 请注意,我使用`squeeze`遇到了一个小问题.对于形状为"(1,1)"的数据帧,它将返回,而不是一系列长度为1,而是一个numpy标量.当对未知长度的对象使用`squeeze`时(例如使用`groupby`),这导致了一个难以捕获的错误. (9认同)
  • 为什么`to_frame` 的倒数不是`to_series` 或`pd.Series(df)` ...? (4认同)
  • 您不需要`.T` (3认同)
  • “谢谢!当 df.iloc[:,0] 和 df.ix[:,0] 都产生太多索引错误时,df.squeeze() 起作用了” (2认同)
  • @IanS 传递参数 `df.squeeze(axis=0)` 或 `df.squeeze(axis=1)` (取决于您想要保存的轴)以避免这种情况 (2认同)

the*_*ist 29

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

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
Run Code Online (Sandbox Code Playgroud)


nic*_*ass 16

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

df.iloc[:,0]  # pandas Series
Run Code Online (Sandbox Code Playgroud)

由于您有一个单行 dataframe df,因此您可以转置它,这样您就处于前一种情况:

df.T.iloc[:,0]
Run Code Online (Sandbox Code Playgroud)


小智 8

You can also use stack()

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

After u run df, then run:

df.stack()
Run Code Online (Sandbox Code Playgroud)

You obtain your dataframe in series


小智 6

其它的办法 -

假设 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))
Run Code Online (Sandbox Code Playgroud)

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