121

pandas DataFrame (たとえばdf.iloc[:, 0]df['A']、またはdf.Aなど) から単一の列を選択すると、結果のベクターは、単一列の DataFrame ではなく Series に自動的に変換されます。ただし、DataFrame を入力引数として受け取る関数をいくつか書いています。したがって、関数が df.columns にアクセスできると想定できるように、Series ではなく単一列の DataFrame を処理することを好みます。今のところ、のようなものを使用して Series を DataFrame に明示的に変換する必要がありpd.DataFrame(df.iloc[:, 0])ます。これは、最もクリーンな方法とは思えません。結果がシリーズではなく単一列のデータフレームになるように、データフレームから直接インデックスを作成するよりエレガントな方法はありますか?

4

5 に答える 5

124

@Jeffが言及しているように、これを行うにはいくつかの方法がありますが、loc/ilocを使用してより明示的にすることをお勧めします(あいまいなことをしようとしている場合は、早期にエラーを発生させます):

In [10]: df = pd.DataFrame([[1, 2], [3, 4]], columns=['A', 'B'])

In [11]: df
Out[11]:
   A  B
0  1  2
1  3  4

In [12]: df[['A']]

In [13]: df[[0]]

In [14]: df.loc[:, ['A']]

In [15]: df.iloc[:, [0]]

Out[12-15]:  # they all return the same thing:
   A
0  1
1  3

後者の 2 つの選択肢は、整数列名の場合のあいまいさを取り除きます (正確には loc/iloc が作成された理由)。例えば:

In [16]: df = pd.DataFrame([[1, 2], [3, 4]], columns=['A', 0])

In [17]: df
Out[17]:
   A  0
0  1  2
1  3  4

In [18]: df[[0]]  # ambiguous
Out[18]:
   A
0  1
1  3
于 2013-05-28T10:03:16.580 に答える
9

Andy Haydenが推奨するように、.iloc/.loc を使用して (単一列の) データフレームにインデックスを付けることが最善の方法です。もう 1 つの注意点は、インデックス位置の表現方法です。リストされたインデックス ラベル/位置を使用し、引数値を指定してデータフレームとしてインデックスを作成します。そうしないと、「pandas.core.series.Series」が返されます

入力:

    A_1 = train_data.loc[:,'Fraudster']
    print('A_1 is of type', type(A_1))
    A_2 = train_data.loc[:, ['Fraudster']]
    print('A_2 is of type', type(A_2))
    A_3 = train_data.iloc[:,12]
    print('A_3 is of type', type(A_3))
    A_4 = train_data.iloc[:,[12]]
    print('A_4 is of type', type(A_4))

出力:

    A_1 is of type <class 'pandas.core.series.Series'>
    A_2 is of type <class 'pandas.core.frame.DataFrame'>
    A_3 is of type <class 'pandas.core.series.Series'>
    A_4 is of type <class 'pandas.core.frame.DataFrame'>
于 2019-07-11T06:41:06.660 に答える