データが異なる列にありますが、それを抽出して別の変数に保存する方法がわかりません。
index a b c
1 2 3 4
2 3 4 5
'a'
、'b'
を選択してdf1に保存する方法
私は試した
df1 = df['a':'b']
df1 = df.ix[:, 'a':'b']
どれもうまくいかないようです。
列名(文字列)は、試した方法でスライスすることはできません。
ここではいくつかの選択肢があります。コンテキストからどの変数を切り出すのかを知っていれば、リストを__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
列名(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
配列です。
バージョン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
...
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
私はこの質問はかなり古いものだと思いますが、最新版のパンダではこれを正確に行う簡単な方法があります。列名(文字列)は好きなようにスライスできます.
columns = ['b', 'c']
df1 = pd.DataFrame(df, columns=columns)
削除する列のリストを指定して、Pandas DataFrameのdrop()
関数を使用して必要な列だけを返してDataFrameを返すことができます。
ただ言って
colsToDrop = ['a']
df.drop(colsToDrop, axis=1)
列b
とc
のみを含むDataFrameを返します。
drop
メソッドは文書化されています ここ 。
単に使用する:それはbとc列を選択します。
df1=pd.DataFrame()
df1=df[['b','c']]
それから、uは単にdf1を呼び出すことができます。
df1
パンダ付き
ウィット列名
dataframe[['column1','column2']]
ilocでは、列インデックスは次のように使用できます。
dataframe[:,[1,2]]
locカラム名は
dataframe[:,['column1','column2']]
それが役に立てば幸い !
行インデックスと列名で1つの要素を取得したい場合は、df['b'][0]
と同じように実行できます。それはあなたが描くことができるのと同じくらい簡単です。
あるいは、df.ix[0,'b']
、indexとlabelを混在させて使用することもできます。
注: v0.20以降、ix
はloc
/iloc
のために非推奨になりました。
以下が私のコードです:
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にコピーしました。
上記の応答で説明したさまざまなアプローチは、ユーザーがドロップまたはサブセット化する列インデックスを知っているか、またはユーザーが列の範囲を使用してデータフレームをサブセット化することを望んでいるという仮定に基づいています。 。 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
私はこれが最適化されたアプローチではないことを確信していますが、別のものと見なすことができます。
`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()
私はそれについていくつかの答えを見ました、しかし上は私には不明のままでした。興味のある列をどのように選択しますか。その答えは、それらをリストに集めた場合、リストを使用して列を参照するだけでよいということです。
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列を指定します。元のデータセットには103の列があり、それらを正確に抽出したいのですが
dataset[extracted_features]
そして、あなたはこれで終わるでしょう
これはあなたが機械学習において(より具体的には、機能選択において)かなり頻繁に使用するものです。私は他の方法についても議論したいと思います、しかし私はそれが他のstackoverflowersによって既にカバーされたと思います。これが参考になったことを願っています!
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.21.0以降では、.loc
を優先して、[]
または.reindex
に1つ以上のラベルが欠けているリストを使用することは非推奨です。だから、あなたの質問に対する答えは:
df1 = df.reindex(columns=['b','c'])
以前のバージョンでは、.loc[list-of-labels]
を使用すると、少なくとも1つのキーが見つかる限り機能しました(そうでなければKeyError
が発生します)。この動作は推奨されておらず、警告メッセージが表示されます。推奨される代替方法は.reindex()
を使うことです。
データの索引付けと選択 でもっと読む
あなたはパンダを使うことができます。私は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_1
とTest_3
の列のPeter
とAnn
がほしい場合
df.loc[['Peter', 'Ann'],['Test_1','Test_3']]
あなたが得る:
Test_1 Test_3
Peter 5 5
Ann 7 9