web-dev-qa-db-ja.com

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

4列のパンダDataFrameがあり、 new DataFrameを作成したいと考えています。 only には3列あります。この質問は次のようなものです。 データフレームから特定の列を抽出する しかしRではなくpandasのために。

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 

それをするためのパンダ的な方法は何ですか?

104
SpeedCoder5

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

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

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

別の方法はデフォルトでコピーを作成するfilterを使うことです:

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

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

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

最も簡単な方法は

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

3
stidmatt

一般的な機能形式

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
Deslin Naidoo

もう1つの簡単な方法は、

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
2
Hit

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

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

と同じデータフレームを返します

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