将 pandas 数据框转换为系列
Convert pandas data frame to series
我对 pandas 有点陌生。我有一个 pandas 数据框,它是 1 行乘 23 列。
我想把它变成一个系列?我想知道最符合 Python 风格的方法是什么?
我试过 pd.Series(myResults)
但它抱怨 ValueError: cannot copy sequence with size 23 to array axis with dimension 1
。它不够聪明,无法意识到它在数学方面仍然是 "vector"。
谢谢!
It's not smart enough to realize it's still a "vector" in math terms.
更确切地说,它足够聪明,可以识别维度上的差异。 :-)
我认为您可以做的最简单的事情是 select 使用 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'>
您可以使用以下两种方法之一通过切片数据框来检索系列:
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
您可以转置单行数据帧(仍然会产生数据帧),然后 squeeze 将结果转换成一个系列(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 是包含 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 中获取系列。
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)
这给出了一个数据框,其中索引作为数据的列名,所有数据都存在于 "values" 列中
你也可以使用 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]
我对 pandas 有点陌生。我有一个 pandas 数据框,它是 1 行乘 23 列。
我想把它变成一个系列?我想知道最符合 Python 风格的方法是什么?
我试过 pd.Series(myResults)
但它抱怨 ValueError: cannot copy sequence with size 23 to array axis with dimension 1
。它不够聪明,无法意识到它在数学方面仍然是 "vector"。
谢谢!
It's not smart enough to realize it's still a "vector" in math terms.
更确切地说,它足够聪明,可以识别维度上的差异。 :-)
我认为您可以做的最简单的事情是 select 使用 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'>
您可以使用以下两种方法之一通过切片数据框来检索系列:
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
您可以转置单行数据帧(仍然会产生数据帧),然后 squeeze 将结果转换成一个系列(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 是包含 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 中获取系列。
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)
这给出了一个数据框,其中索引作为数据的列名,所有数据都存在于 "values" 列中
你也可以使用 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]