私はパンダに少し慣れていません。1行23列のパンダデータフレームがあります。
これをシリーズに変換したいですか?これを行うための最もPython的な方法は何ですか?
私は試しましたpd.Series(myResults)
が、文句を言いValueError: cannot copy sequence with size 23 to array axis with dimension 1
ます。数学的にはまだ「ベクトル」であることに気付くほど賢くはありません。
ありがとう!
私はパンダに少し慣れていません。1行23列のパンダデータフレームがあります。
これをシリーズに変換したいですか?これを行うための最もPython的な方法は何ですか?
私は試しましたpd.Series(myResults)
が、文句を言いValueError: cannot copy sequence with size 23 to array axis with dimension 1
ます。数学的にはまだ「ベクトル」であることに気付くほど賢くはありません。
ありがとう!
回答:
数学的にはまだ「ベクトル」であることに気付くほど賢くはありません。
むしろ、次元の違いを認識するのに十分賢いと言ってください。:-)
あなたができる最も簡単なことは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'>
df.T
シリーズは生成されませんが、転置された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ではなく、numpyスカラーが返されます。これにより、squeeze
長さが不明なオブジェクト(withなどgroupby
)で使用すると、キャッチしにくいバグが発生しました。
to_frame
notto_series
またはpd.Series(df)
...の逆ですか?
.T
df.squeeze(axis=0)
か、df.squeeze(axis=1)
(保存する軸に応じて)それを回避します
次の2つの方法のいずれかを使用してデータフレームをスライスすることにより、シリーズを取得できます。
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
別の方法 -
myResultが、1列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))
同様に、複数の列を持つデータフレームからシリーズを取得できます。
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)
これにより、データの列名としてインデックスを持つデータフレームが提供され、すべてのデータが「値」列に存在します
df.T