我对熊猫有些陌生。我有一个熊猫数据框,它是1行乘23列。
我想将其转换为系列吗?我想知道最pythonic的方法是什么?
我已经尝试过了,pd.Series(myResults)
但是抱怨ValueError: cannot copy sequence with size 23 to array axis with dimension 1
。它还不够聪明,无法意识到它仍然是数学上的“向量”。
谢谢!
Answers:
它还不够聪明,无法意识到它仍然是数学上的“向量”。
可以说它足够聪明,可以识别尺寸差异。:-)
我认为您可以做的最简单的事情是使用位置选择该行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'>
df.T
不会产生Series,只是转置的DataFrame。
df.iloc
是,如果您有一个空的df,这将引发一个IndexError
。为避免这种情况,请在转置df之后使用df.squeeze
方法。参考 到pandas.pydata.org/pandas-docs/stable/reference/api/...
您可以转置单行数据框(仍会生成一个数据框),然后将结果压缩为一系列(与相反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, :]
squeeze
。对于形状的数据框,(1, 1)
它将返回,而不是一系列长度为1的数字,而是一个小数的标量。squeeze
在长度未知的对象(例如与groupby
)上使用时,这导致难以捕获的错误。
to_frame
不是to_series
或pd.Series(df)
...的反面呢?
.T
df.squeeze(axis=0)
或df.squeeze(axis=1)
(取决于您要保留的轴)可避免这种情况
您可以使用以下两种方法之一对数据框进行切片来检索系列:
http://pandas.pydata.org/pandas-docs/stable/generation/pandas.DataFrame.iloc.html http://pandas.pydata.org/pandas-docs/stable/generation/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
其他方式 -
假设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中获得序列。
df.T