1. ホーム
  2. python

[解決済み] Python pandasです。選択した列をSeriesではなくDataFrameとして保持する

2022-09-14 21:59:34

質問

pandasのDataFrameから1つのカラムを選択する場合(例えば df.iloc[:, 0] , df['A'] または df.A など)、結果として得られるベクトルは、1列のDataFrameではなく、自動的にSeriesに変換されます。しかし、私はDataFrameを入力引数として受け取る関数をいくつか書いています。したがって、私は、関数がdf.columnsがアクセス可能であると仮定できるように、Seriesではなく、シングルカラムのDataFrameを扱うことを希望します。今のところ、私は以下のようなものを使って、明示的にSeriesをDataFrameに変換しなければなりません。 pd.DataFrame(df.iloc[:, 0]) . これは、最もクリーンな方法とは思えません。DataFrameから直接インデックスを作成して、結果がSeriesではなく1列のDataFrameになるような、よりエレガントな方法はないでしょうか?

どのように解決するのですか?

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