選択した特定の列を新しいDataFrameにコピーとして抽出する


184

4列のpandas DataFrameがあり、列が3つだけの新しい DataFrame を作成したいと思います。この質問は次のようなものです。データフレームから特定の列を抽出するが、Rではないパンダの場合。次のコードは機能せず、エラーが発生し、パンダの方法ではありません。

import pandas as pd
old = pd.DataFrame({'A' : [4,5], 'B' : [10,20], 'C' : [100,50], 'D' : [-30,-50]})
new = pd.DataFrame(zip(old.A, old.C, old.D)) # raises TypeError: data argument can't be an iterator 

それを行うためのパンダニックな方法は何ですか?

回答:


358

これを行う方法があり、実際にはRに似ています

new = old[['A', 'C', 'D']].copy()

ここでは、元のデータフレームから必要な列を選択し、それらの変数を作成しています。新しいデータフレームをまったく変更したい場合は、.copy()を回避するために使用することになるでしょうSettingWithCopyWarning

別の方法としてfilter、デフォルトでコピーを作成する方法があります。

new = old.filter(['A','B','D'], axis=1)

最後に、元のデータフレームの列数によっては、これをaを使用して表現する方が簡潔な場合がありますdrop(これにより、デフォルトでコピーも作成されます)。

new = old.drop('B', axis=1)

20
1つの列だけをコピーする場合の注意:ではold[['A']].copy()、新しいデータフレームを作成するために二重の角括弧が必要です。old['A'].copy()シリーズのみを作成することに注意してください。
intotecho

19

最も簡単な方法は

new = old[['A','C','D']]


3
明示的に.copy()を呼び出さない限り、これはコピーを作成しません
Sylvain

これはデフォルトでコピーされます。
グアイアル

1
@Nguaial単純なインデックス付けの動作は指定されていません。コピーを取得するかビューを取得するかはわかりません。詳細についてはドキュメントを参照してください:pandas.pydata.org/pandas-docs/stable/user_guide/...
オレネスファス

8

別の簡単な方法は次のようです:

new = pd.DataFrame([old.A, old.B, old.C]).transpose()

どこでold.column_nameあなたにシリーズを与えるでしょう。保持するすべての列シリーズのリストを作成し、それをDataFrameコンストラクターに渡します。形状を調整するために転置を行う必要があります。

In [14]:pd.DataFrame([old.A, old.B, old.C]).transpose()
Out[14]: 
   A   B    C
0  4  10  100
1  5  20   50

機能しますが、column_nameに特殊文字が含まれている場合は機能しません。
jimh

ああそのことを考えていなかった
ヒット

3

一般的な関数形

def select_columns(data_frame, column_names):
    new_frame = data_frame.loc[:, column_names]
    return new_frame

上記の問題に固有

selected_columns = ['A', 'C', 'D']
new = select_columns(old, selected_columns)

2

新しいデータフレームが必要な場合:

import pandas as pd
old = pd.DataFrame({'A' : [4,5], 'B' : [10,20], 'C' : [100,50], 'D' : [-30,-50]})
new=  old[['A', 'C', 'D']]

1

私の知る限り、フィルター関数を使用するときに必ずしも軸を指定する必要はありません。

new = old.filter(['A','B','D'])

同じデータフレームを返す

new = old.filter(['A','B','D'], axis=1)

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