パンダのデータフレームをシリーズに変換する


97

私はパンダに少し慣れていません。1行23列のパンダデータフレームがあります。

これをシリーズに変換したいですか?これを行うための最もPython的な方法は何ですか?

私は試しましたpd.Series(myResults)が、文句を言いValueError: cannot copy sequence with size 23 to array axis with dimension 1ます。数学的にはまだ「ベクトル」であることに気付くほど賢くはありません。

ありがとう!

回答:


63

数学的にはまだ「ベクトル」であることに気付くほど賢くはありません。

むしろ、次元の違いを認識するのに十分賢いと言ってください。:-)

あなたができる最も簡単なことは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'>

2
または、別の方法:df.T
ako

14
@ako:df.Tシリーズは生成されませんが、転置されたDataFrameのみが生成されます。
DSM

@DSM。つまり、[0] df.T.iloc本当だ
アントニオ・アンドレス

使用に関する唯一の問題df.ilocは、空のdfがある場合、これによりIndexError。が発生することです。これを回避するには、dfを転置した後、df.squeezeメソッドを使用します。参照。pandas.pydata.org/pandas-docs/stable/reference/api/
Nicolas 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ではなく、numpyスカラーが返されます。これにより、squeeze長さが不明なオブジェクト(withなどgroupby)で使用すると、キャッチしにくいバグが発生しました。
IanS 2017年

2
「ありがとう!df.iloc [:、0]とdf.ix [:、0]の両方でインデックスエラーが多すぎる場合、df.squeeze()が機能しました」
Afflatus 2017

3
そして、なぜto_framenotto_seriesまたはpd.Series(df)...の逆ですか?
jhin 2018

4
必要ありません.T
elgehelge 2018年

1
@IanSは引数を渡すdf.squeeze(axis=0)か、df.squeeze(axis=1)(保存する軸に応じて)それを回避します
Nicolas Fonteyne


4

別の方法 -

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

同様に、複数の列を持つデータフレームからシリーズを取得できます。


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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.