から列a
と列を選択し、新しいデータフレームに保存するにはどうすればよいですか?b
df
df1
index a b c
1 2 3 4
2 3 4 5
失敗した試み:
df1 = df['a':'b']
df1 = df.ix[:, 'a':'b']
ベストアンサー1
列名 (文字列) は、試した方法でスライスすることはできません。
ここではいくつかのオプションがあります。コンテキストからどの変数を切り出したいかわかっている場合は、リストを渡すことでそれらの列のみのビューを返すことができます。__getitem__
構文([])。
df1 = df[['a', 'b']]
あるいは、名前ではなく数値でインデックスを付けることが重要である場合 (最初の 2 つの列の名前を知らなくても、コードでこれを自動的に実行する必要がある場合など)、代わりに次のようにすることができます。
df1 = df.iloc[:, 0:2] # Remember that Python does not slice inclusive of the ending index.
さらに、Pandas オブジェクトのビューとそのオブジェクトのコピーの概念を理解しておく必要があります。上記のメソッドの最初のものは、目的のサブオブジェクト (目的のスライス) の新しいコピーをメモリ内に返します。
ただし、Pandas のインデックス規則では、これを行わず、元のオブジェクトのサブオブジェクトまたはスライスと同じメモリ チャンクを参照するだけの新しい変数が提供される場合があります。これは 2 番目のインデックス方法で発生するため、メソッドを使用して変更して.copy()
通常のコピーを取得できます。このような場合、スライスされたオブジェクトと思われるものを変更すると、元のオブジェクトが変わることがあります。常にこのことに注意することをお勧めします。
df1 = df.iloc[0, 0:2].copy() # To avoid the case where changing df1 also changes df
を使用するにはiloc
、列の位置 (またはインデックス) を知っている必要があります。列の位置は変更される可能性があるため、インデックスをハードコーディングする代わりに、データフレーム オブジェクトの メソッドの関数iloc
を一緒に使用して列のインデックスを取得できます。get_loc
columns
{df.columns.get_loc(c): c for idx, c in enumerate(df.columns)}
これで、この辞書を使用して、名前と を使用して列にアクセスできるようになりましたiloc
。