将熊猫数据帧转换为串行数据帧

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

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

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

谢谢!

394117 次浏览

它不够聪明,没有意识到在数学术语中它仍然是一个“矢量”。

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

我认为最简单的方法就是使用 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'>

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

Http://pandas.pydata.org/pandas-docs/stable/generated/pandas Http://pandas.pydata.org/pandas-docs/stable/generated/pandas

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

您可以转换单行数据帧(仍然会导致数据帧) ,然后将结果 挤压转换为一个序列(与 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, :]

另一种方式-

假设 myResult 是 dataFrame,其中包含1 coll 和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 获得系列。

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)

这给出了一个数据框,索引作为数据的列名,所有数据都显示在“ value”列中

还可以使用 stack ()

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

运行 df 之后,再运行:

df.stack()

您按顺序获得数据框

如果有一列数据帧 df,可以将其转换为一个序列:

df.iloc[:,0]  # pandas Series

因为您有一个单行数据帧 df,所以您可以将它移位,这样您就处于前一种情况:

df.T.iloc[:,0]

另一种方法很简单

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

Squeeze-> 是转换为 Series 的那个。