1526

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

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

'a'を選択し'b'てdf1に保存するにはどうすればよいですか?

私は試した

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

どれも機能していないようです。

4

21 に答える 21

2368

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

ここにいくつかのオプションがあります。スライスする変数がコンテキストからわかっている場合は、__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_loccolumns

{df.columns.get_loc(c): c for idx, c in enumerate(df.columns)}

これで、このディクショナリを使用して、名前とを使用して列にアクセスできますiloc

于 2012-07-02T02:43:02.740 に答える
213

バージョン0.11.0以降、インデクサーを使用して試した方法で列をスライスできます。.loc

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。たとえば、列名がリストにある場合は-Trueをdf.columns.isin(list('BCD'))返します。それ以外の場合はFalse。array([False, True, True, True, False, False], dtype=bool)['B', 'C', 'D']

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
...
于 2016-04-30T12:39:08.817 に答える
132

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

newdf = df[df.columns[2:4]] # Remember, Python is zero-offset! The "third" entry is at slot two.

EMSが彼の回答で指摘しているように、df.ix列をもう少し簡潔に.columnsスライスしますが、バニラ1次元Pythonリストのインデックス作成/スライス構文を使用しているため、スライスインターフェイスはより自然な場合があります。

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

于 2012-10-31T18:57:33.980 に答える
85

パンダの最新バージョンでは、これを正確に行う簡単な方法があります。列名(文字列)は、好きな方法でスライスできます。

columns = ['b', 'c']
df1 = pd.DataFrame(df, columns=columns)
于 2016-02-04T14:05:35.083 に答える
73
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
于 2012-07-08T17:55:12.493 に答える
49

パンダで、

ウィット列名

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

ilocおよびインデックス番号を持つ特定の列で選択するには:

dataframe.iloc[:,[1,2]]

loc列名は次のように使用できます

dataframe.loc[:,['column1','column2']]
于 2018-11-21T15:32:56.237 に答える
27

ドロップする列のリストを提供し、PandasDataFrameの関数を使用して必要な列のみを含むDataFrameを返すことができますdrop()

ただ言って

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

b列と。だけのDataFrameを返しますc

このdrop方法はここに記載されています。

于 2014-09-03T11:30:59.433 に答える
25

この方法は非常に便利であることがわかりました。

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

詳細については、こちらをご覧ください

于 2017-05-02T09:41:52.950 に答える
25

0.21.0以降、1つ以上のラベルが欠落しているリストを使用する.locか、リストを使用することは廃止され、。が優先されます。したがって、あなたの質問に対する答えは次のとおりです。[].reindex

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

以前のバージョンで.loc[list-of-labels]は、少なくとも1つのキーが見つかった場合に限り、を使用できます(そうでない場合は、が発生しますKeyError)。この動作は廃止され、警告メッセージが表示されるようになりました。推奨される代替手段は、を使用すること.reindex()です。

詳細については、データのインデックス作成と選択をご覧ください。

于 2018-08-15T18:13:41.823 に答える
24

このメソッドを使用して、次のpandas.DataFrame.filterように列をフィルタリングまたは並べ替えることができます。

df1 = df.filter(['a', 'b'])

これは、メソッドをチェーンするときにも非常に役立ちます。

于 2020-04-21T03:03:00.807 に答える
14

パンダを使用できます。

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

そして、あなたがちょうど欲しいなら、そしてPeterAnnからTest_1そしてTest_3

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

あなたが得る:

       Test_1  Test_3
Peter       5       5
Ann         7       9
于 2019-02-20T01:01:58.837 に答える
10

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

または、使用することができますdf.ix[0,'b']-インデックスとラベルの混合使用。

注: v0.20以降、 /ixを優先して非推奨になりました。lociloc

于 2018-01-03T07:56:07.023 に答える
8

使用してみてくださいpandas.DataFrame.getドキュメントを参照):

import pandas as pd
import numpy as np

dates = pd.date_range('20200102', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
df.get(['A', 'C'])
于 2020-08-02T19:10:36.830 に答える
7

1つの異なる簡単なアプローチ:行の反復

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()
于 2018-10-15T11:43:43.840 に答える
7
df[['a', 'b']]  # Select all rows of 'a' and 'b'column 
df.loc[0:10, ['a', 'b']]  # Index 0 to 10 select column 'a' and 'b'
df.loc[0:10, 'a':'b']  # Index 0 to 10 select column 'a' to 'b'
df.iloc[0:10, 3:5]  # Index 0 to 10 and column 3 to 5
df.iloc[3, 3:5]  # Index 3 of column 3 to 5
于 2020-05-19T08:18:08.920 に答える
6

前の回答で説明したさまざまなアプローチは、ユーザーがドロップまたはサブセット化する列インデックスを知っているか、ユーザーが列の範囲(たとえば、「C」:「E」の間)を使用してデータフレームをサブセット化することを望んでいるという仮定に基づいています。 )。

pandas.DataFrame.drop()は確かに、ユーザーが定義した列のリストに基づいてデータをサブセット化するオプションです(ただし、常にデータフレームのコピーを使用することに注意する必要があり、インプレースパラメーターを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
于 2018-07-21T21:28:41.507 に答える
5

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)

于 2019-01-29T05:37:50.140 に答える
4

私はそれについていくつかの答えを見てきましたが、1つは私には不明なままでした。関心のある列をどのように選択しますか?

その答えは、それらをリストに集めている場合は、リストを使用して列を参照するだけでよいということです。

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]

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

ここに画像の説明を入力してください

これは、機械学習(より具体的には、特徴選択)で非常に頻繁に使用されるものです。他の方法についても話し合いたいと思いますが、それはすでに他のStackOverflowerユーザーによってカバーされていると思います。

于 2019-05-26T19:21:50.553 に答える
3

複数の列を選択するには、後でそれらを抽出して表示します。df新しいデータフレームを作成するのではなく、以前はデータフレームという名前で、抽出して表示df1する列AからDを選択します。

df1 = pd.DataFrame(data_frame, columns=['Column A', 'Column B', 'Column C', 'Column D'])
df1

必要なすべての列が表示されます!

于 2020-10-11T10:40:52.347 に答える
2

一部の列を除外するには、それらを列インデックスにドロップします。例えば:

   A   B    C     D
0  1  10  100  1000
1  2  20  200  2000

2つを除くすべてを選択します。

df[df.columns.drop(['B', 'D'])]

出力:

   A    C
0  1  100
1  2  200

メソッドtruncateを使用して、中央の列を選択することもできます。

df.truncate(before='B', after='C', axis=1)

出力:

    B    C
0  10  100
1  20  200
于 2021-05-04T08:19:45.257 に答える
1
def get_slize(dataframe, start_row, end_row, start_col, end_col):
    assert len(dataframe) > end_row and start_row >= 0
    assert len(dataframe.columns) > end_col and start_col >= 0
    list_of_indexes = list(dataframe.columns)[start_col:end_col]
    ans = dataframe.iloc[start_row:end_row][list_of_indexes]
    return ans

この関数を使用するだけです

于 2021-05-02T21:20:23.143 に答える