将熊猫数据框转换为序列


97

我对熊猫有些陌生。我有一个熊猫数据框,它是1行乘23列。

我想将其转换为系列吗?我想知道最pythonic的方法是什么?

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

谢谢!

Answers:


63

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

可以说它足够聪明,可以识别尺寸差异。:-)

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

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

2
或者,以另一种方式:df.T
2015年

14
@ako:但是df.T不会产生Series,只是转置的DataFrame。
DSM

@DSM。没错,df.T.iloc [0]
AntonioAndrés

使用的唯一问题df.iloc是,如果您有一个空的df,这将引发一个IndexError。为避免这种情况,请在转置df之后使用df.squeeze方法。参考 到pandas.pydata.org/pandas-docs/stable/reference/api/...
萨科Fonteyne

60

您可以转置单行数据框(仍会生成一个数据框),然后结果压缩为一系列(与相反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

注意:为了适应@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, :]

11
请注意,我使用遇到了一个小问题squeeze。对于形状的数据框,(1, 1)它将返回,而不是一系列长度为1的数字,而是一个小数的标量。squeeze在长度未知的对象(例如与groupby)上使用时,这导致难以捕获的错误。
IanS

2
“谢谢!当df.iloc [:,0]和df.ix [:,0]都产生太多索引错误时df.squeeze()起作用了”
Afflatus

3
为什么to_frame不是to_seriespd.Series(df)...的反面呢?
jhin

4
您不需要.T
elgehelge

1
@IanS传递参数df.squeeze(axis=0)df.squeeze(axis=1)(取决于您要保留的轴)可避免这种情况
Nicolas Fonteyne


4

其他方式 -

假设myResult是包含1 col和23行形式的数据的dataFrame

// 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中获得序列。


3

您也可以使用stack()

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

在您运行df之后,请运行:

df.stack()

您获得系列数据


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

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


5
欢迎使用Stack Overflow!这如何回答这个问题?您的代码未返回问题所要求的序列
Gricey
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.