web-dev-qa-db-ja.com

パンダデータフレームで複数の列を選択する

データが異なる列にありますが、それを抽出して別の変数に保存する方法がわかりません。

index  a   b   c
1      2   3   4
2      3   4   5

'a''b'を選択してdf1に保存する方法

私は試した 

df1 = df['a':'b']
df1 = df.ix[:, 'a':'b']

どれもうまくいかないようです。

663
user1234440

列名(文字列)は、試した方法でスライスすることはできません。

ここではいくつかの選択肢があります。コンテキストからどの変数を切り出すのかを知っていれば、リストを__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
1121
ely

列名(df.columns)が['index','a','b','c']であると仮定すると、必要なデータはの3番目と4番目の列にあります。スクリプトの実行時にそれらの名前がわからない場合は、これを実行できます。

newdf = df[df.columns[2:4]] # Remember, Python is 0-offset! The "3rd" entry is at slot 2.

EMSが 彼の答え で指摘しているように、df.ixスライス列はもう少し簡潔になりますが、.columnsスライスインターフェースはVanilla 1-D pythonリストインデックス/スライス構文を使用するのでより自然かもしれません。

警告:'index'DataFrame列には不適切な名前です。同じラベルが実際のdf.index属性、Index配列にも使われます。したがって、カラムはdf['index']によって返され、実際のDataFrameインデックスはdf.indexによって返されます。 Indexは、その要素の値を検索するために最適化された特別な種類のSeriesです。 df.indexでは、ラベルで行を検索します。そのdf.columns属性も、ラベルで列を検索するためのpd.Index配列です。

85
hobs

バージョン0.11.0以降では、 .loc indexerを使用して試した方法で 列を スライスすることができます。 

df.loc[:, 'C':'E']

と同等です

df[['C', 'D', 'E']]  # or df.loc[:, ['C', 'D', 'E']]

CからEまでの列を返します。


ランダムに生成されたDataFrameのデモ:

import pandas as pd
import numpy as np
np.random.seed(5)
df = pd.DataFrame(np.random.randint(100, size=(100, 6)), 
                  columns=list('ABCDEF'), 
                  index=['R{}'.format(i) for i in range(100)])
df.head()

Out: 
     A   B   C   D   E   F
R0  99  78  61  16  73   8
R1  62  27  30  80   7  76
R2  15  53  80  27  44  77
R3  75  65  47  30  84  86
R4  18   9  41  62   1  82

CからEまでの列を取得するには(整数スライスとは異なり、 'E'が列に含まれることに注意してください)。

df.loc[:, 'C':'E']

Out: 
      C   D   E
R0   61  16  73
R1   30  80   7
R2   80  27  44
R3   47  30  84
R4   41  62   1
R5    5  58   0
...

ラベルに基づいて行を選択する場合も同様です。それらの列から行 'R6'から 'R10'を取得します。

df.loc['R6':'R10', 'C':'E']

Out: 
      C   D   E
R6   51  27  31
R7   83  19  18
R8   11  67  65
R9   78  27  29
R10   7  16  94

.locはブール配列も受け入れるので、配列内の対応するエントリがTrueである列を選択できます。たとえば、df.columns.isin(list('BCD'))array([False, True, True, True, False, False], dtype=bool)を返します - 列名がリスト['B', 'C', 'D']に含まれていればTrue。それ以外の場合は偽です。

df.loc[:, df.columns.isin(list('BCD'))]

Out: 
      B   C   D
R0   78  61  16
R1   27  30  80
R2   53  80  27
R3   65  47  30
R4    9  41  62
R5   78   5  58
...
80
ayhan
In [39]: df
Out[39]: 
   index  a  b  c
0      1  2  3  4
1      2  3  4  5

In [40]: df1 = df[['b', 'c']]

In [41]: df1
Out[41]: 
   b  c
0  3  4
1  4  5
55
Wes McKinney

私はこの質問はかなり古いものだと思いますが、最新版のパンダではこれを正確に行う簡単な方法があります。列名(文字列)は好きなようにスライスできます.

columns = ['b', 'c']
df1 = pd.DataFrame(df, columns=columns)
39
zerovector

削除する列のリストを指定して、Pandas DataFrameのdrop()関数を使用して必要な列だけを返してDataFrameを返すことができます。

ただ言って

colsToDrop = ['a']
df.drop(colsToDrop, axis=1)

bcのみを含むDataFrameを返します。

dropメソッドは文書化されています ここ

私はこの方法がとても便利だと思った。

# iloc[row slicing, column slicing]
surveys_df.iloc [0:3, 1:4]

詳細を見つけることができます ここ

16
Alvis

単に使用する:それはbとc列を選択します。

df1=pd.DataFrame()
df1=df[['b','c']]

それから、uは単にdf1を呼び出すことができます。

df1
11
Akash Nayak

パンダ付き 

ウィット列名 

dataframe[['column1','column2']]

ilocでは、列インデックスは次のように使用できます。

dataframe[:,[1,2]]

locカラム名は

dataframe[:,['column1','column2']]

それが役に立てば幸い !

5
Vivek Ananthan

行インデックスと列名で1つの要素を取得したい場合は、df['b'][0]と同じように実行できます。それはあなたが描くことができるのと同じくらい簡単です。 

あるいは、df.ix[0,'b']、indexとlabelを混在させて使用することもできます。

注: v0.20以降、ixloc/ilocのために非推奨になりました。

5
W.Perrin

以下が私のコードです:

import pandas as pd
df = pd.read_Excel("data.xlsx", sheet_name = 2)
print df
df1 = df[['emp_id','date']]
print df1

出力:

  emp_id        date  count
0   1001   11/1/2018      3
1   1002   11/1/2018      4
2          11/2/2018      2
3          11/3/2018      4
  emp_id        date
0   1001   11/1/2018
1   1002   11/1/2018
2          11/2/2018
3          11/3/2018

最初のデータフレームはマスターのものです。 2つの列をdf1にコピーしました。

3
Rishi Bansal

上記の応答で説明したさまざまなアプローチは、ユーザーがドロップまたはサブセット化する列インデックスを知っているか、またはユーザーが列の範囲を使用してデータフレームをサブセット化することを望んでいるという仮定に基づいています。 。 pandas.DataFrame.drop() は、ユーザーが定義した列のリストに基づいてデータをサブセット化するためのオプションです(ただし、dataframeのコピーと inplace parametersを常に使用することには注意が必要です)。 True !!に設定しないでください。 

もう1つの選択肢は pandas.columns.difference() を使用することです。これは列名を設定し、必要な列を含む配列のインデックスタイプを返します。解決策は次のとおりです。

df = pd.DataFrame([[2,3,4],[3,4,5]],columns=['a','b','c'],index=[1,2])
columns_for_differencing = ['a']
df1 = df.copy()[df.columns.difference(columns_for_differencing)]
print(df1)

出力は次のようになります。 b c 1 3 4 2 4 5

3
Harshit

私はこれが最適化されたアプローチではないことを確信していますが、別のものと見なすことができます。

iterowsを使う

`df1= pd.DataFrame() #creating an empty dataframe
 for index,i in df.iterrows():
 df1.loc[index,'A']=df.loc[index,'A']
 df1.loc[index,'B']=df.loc[index,'B']
 df1.head()
2
Ankita

私はそれについていくつかの答えを見ました、しかし上は私には不明のままでした。興味のある列をどのように選択しますか。その答えは、それらをリストに集めた場合、リストを使用して列を参照するだけでよいということです。

print(extracted_features.shape)
print(extracted_features)

(63,)
['f000004' 'f000005' 'f000006' 'f000014' 'f000039' 'f000040' 'f000043'
 'f000047' 'f000048' 'f000049' 'f000050' 'f000051' 'f000052' 'f000053'
 'f000054' 'f000055' 'f000056' 'f000057' 'f000058' 'f000059' 'f000060'
 'f000061' 'f000062' 'f000063' 'f000064' 'f000065' 'f000066' 'f000067'
 'f000068' 'f000069' 'f000070' 'f000071' 'f000072' 'f000073' 'f000074'
 'f000075' 'f000076' 'f000077' 'f000078' 'f000079' 'f000080' 'f000081'
 'f000082' 'f000083' 'f000084' 'f000085' 'f000086' 'f000087' 'f000088'
 'f000089' 'f000090' 'f000091' 'f000092' 'f000093' 'f000094' 'f000095'
 'f000096' 'f000097' 'f000098' 'f000099' 'f000100' 'f000101' 'f000103']

私は以下のリスト/ numpy配列extracted_featuresを持っています、63列を指定します。元のデータセットには10​​3の列があり、それらを正確に抽出したいのですが

dataset[extracted_features]

そして、あなたはこれで終わるでしょう

enter image description here 

これはあなたが機械学習において(より具体的には、機能選択において)かなり頻繁に使用するものです。私は他の方法についても議論したいと思います、しかし私はそれが他のstackoverflowersによって既にカバーされたと思います。これが参考になったことを願っています!

0
Kareem Jeiroudi

df.pop()も使えます

>>> df = pd.DataFrame([('falcon', 'bird',    389.0),
...                    ('parrot', 'bird',     24.0),
...                    ('lion',   'mammal',   80.5),
...                    ('monkey', 'mammal', np.nan)],
...                   columns=('name', 'class', 'max_speed'))
>>> df
     name   class  max_speed
0  falcon    bird      389.0
1  parrot    bird       24.0
2    lion  mammal       80.5
3  monkey  mammal 

>>> df.pop('class')
0      bird
1      bird
2    mammal
3    mammal
Name: class, dtype: object

>>> df
     name  max_speed
0  falcon      389.0
1  parrot       24.0
2    lion       80.5
3  monkey        NaN

これがあなたに役立つかどうか私に知らせてください、df.pop(c)を使ってください

0
Puneet Sinha

0.21.0以降では、.locを優先して、[]または.reindexに1つ以上のラベルが欠けているリストを使用することは非推奨です。だから、あなたの質問に対する答えは:

df1 = df.reindex(columns=['b','c'])

以前のバージョンでは、.loc[list-of-labels]を使用すると、少なくとも1つのキーが見つかる限り機能しました(そうでなければKeyErrorが発生します)。この動作は推奨されておらず、警告メッセージが表示されます。推奨される代替方法は.reindex()を使うことです。

データの索引付けと選択 でもっと読む

0
tozCSS

あなたはパンダを使うことができます。私はDataFrameを作ります:

    import pandas as pd
    df = pd.DataFrame([[1, 2,5], [5,4, 5], [7,7, 8], [7,6,9]], 
                      index=['Jane', 'Peter','Alex','Ann'],
                      columns=['Test_1', 'Test_2', 'Test_3'])

DataFrame:

           Test_1  Test_2  Test_3
    Jane        1       2       5
    Peter       5       4       5
    Alex        7       7       8
    Ann         7       6       9

名前で1つ以上の列を選択するには

    df[['Test_1','Test_3']]

           Test_1  Test_3
    Jane        1       5
    Peter       5       5
    Alex        7       8
    Ann         7       9

また使用することができます:

    df.Test_2

そして列Test_2を取得します

    Jane     2
    Peter    4
    Alex     7
    Ann      6

.loc()を使用して、これらの行から列と行を選択することもできます。これは "スライス" と呼ばれます。私は列Test_1からTest_3に持っていくことに注意してください

    df.loc[:,'Test_1':'Test_3']

「スライス」は次のとおりです。

            Test_1  Test_2  Test_3
     Jane        1       2       5
     Peter       5       4       5
     Alex        7       7       8
     Ann         7       6       9

Test_1Test_3の列のPeterAnnがほしい場合

    df.loc[['Peter', 'Ann'],['Test_1','Test_3']]

あなたが得る:

           Test_1  Test_3
    Peter       5       5
    Ann         7       9
0
pink.slash