如何将单行pandas数据框转换为系列?

问题描述 投票:0回答:8

我对熊猫有点陌生。我有一个 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
8个回答
112
投票

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

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, :]

82
投票

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

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

我认为您可以做的最简单的事情是使用

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'>

39
投票

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

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

16
投票

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

df.iloc[:,0]  # pandas Series

由于您有一个单行数据框

df
,您可以转置它,这样您就处于前一种情况:

df.T.iloc[:,0]

10
投票

你也可以使用stack()

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

运行 df 后,然后运行:

df.stack()

您连续获得数据框


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))

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


1
投票
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)

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


1
投票

另一种方法也很简单

df= df.iloc[3].reset_index(drop=True).squeeze()

Squeeze -> 是转换为系列的那个。

© www.soinside.com 2019 - 2024. All rights reserved.