私はCSVファイルからいくつかの機械学習データをロードします。最初の2列は観測値で、残りの列は機能です。
現在、私は以下をします:
data = pandas.read_csv('mydata.csv')
これは次のようになります。
data = pandas.DataFrame(np.random.Rand(10,5), columns = list('abcde'))
このデータフレームを2つのデータフレームにスライスしたいと思います。1つはa
とb
という列を含み、もう1つはc
、d
とe
という列を含みます。
のようなものを書くことは不可能です
observations = data[:'c']
features = data['c':]
私は最善の方法が何であるかわからない。 pd.Panel
が必要ですか?
ちなみに、data['a']
は許可されていますがdata[0]
は許可されていません。一方、data['a':]
は許可されていませんがdata[0:]
は許可されています。これには実際的な理由がありますか? data[0] != data[0:1]
が与えられて、カラムがIntによってインデックスされている場合、これは本当に混乱します。
ドキュメントの 非推奨を参照してください
.loc
はラベルベースのインデックスを使用して行と列の両方を選択します。ラベルはインデックスまたは列の値です。 .loc
でスライスすると最後の要素が含まれます。
次の列を持つDataFrameがあるとしましょう。
foo
、bar
、quz
、ant
、cat
、sat
、dat
.
# selects all rows and all columns beginning at 'foo' up to and including 'sat'
df.loc[:, 'foo':'sat']
# foo bar quz ant cat sat
.loc
は、Pythonリストが行と列の両方に対して行うのと同じスライス表記を受け入れます。スライス表記はstart:stop:step
です
# slice from 'foo' to 'cat' by every 2nd column
df.loc[:, 'foo':'cat':2]
# foo quz cat
# slice from the beginning to 'bar'
df.loc[:, :'bar']
# foo bar
# slice from 'quz' to the end by 3
df.loc[:, 'quz'::3]
# quz sat
# attempt from 'sat' to 'bar'
df.loc[:, 'sat':'bar']
# no columns returned
# slice from 'sat' to 'bar'
df.loc[:, 'sat':'bar':-1]
sat cat ant quz bar
# slice notation is syntatic sugar for the slice function
# slice from 'quz' to the end by 2 with slice function
df.loc[:, slice('quz',None, 2)]
# quz cat dat
# select specific columns with a list
# select columns foo, bar and dat
df.loc[:, ['foo','bar','dat']]
# foo bar dat
行と列でスライスできます。たとえば、ラベルがv
、w
、x
、y
、z
の5行があるとします。
# slice from 'w' to 'y' and 'foo' to 'ant' by 3
df.loc['w':'y', 'foo':'ant':3]
# foo ant
# w
# x
# y
DataFrame.ixインデックスはあなたがアクセスしたいものです。ちょっとややこしいですが(Pandasの索引付けは時々困惑していることに同意します)、以下はあなたが望むことをするようです:
>>> df = DataFrame(np.random.Rand(4,5), columns = list('abcde'))
>>> df.ix[:,'b':]
b c d e
0 0.418762 0.042369 0.869203 0.972314
1 0.991058 0.510228 0.594784 0.534366
2 0.407472 0.259811 0.396664 0.894202
3 0.726168 0.139531 0.324932 0.906575
ここで、.ix [row slice、column slice]は解釈されているものです。 Pandasインデックス作成の詳細はこちら: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-advanced
注: .ix
は、Pandas v0.20から非推奨になりました。必要に応じて、代わりに.loc
または.iloc
を使用してください。
例として、seabornパッケージのタイタニックデータセットを使用しましょう。
# Load dataset (pip install seaborn)
>> import seaborn.apionly as sns
>> titanic = sns.load_dataset('titanic')
列名を使う
>> titanic.loc[:,['sex','age','fare']]
列インデックスを使う
>> titanic.iloc[:,[2,3,6]]
ixを使用(Pandasよりも古い<.20バージョン)
>> titanic.ix[:,[‘sex’,’age’,’fare’]]
または
>> titanic.ix[:,[2,3,6]]
reindexメソッドを使う
>> titanic.reindex(columns=['sex','age','fare'])
また、与えられたDataFrame
データ
あなたの例のように、もしあなたが列aとdだけ(例えば1番目と4番目の列)を抽出したいのであれば、パンダデータフレームからのiloc法があなたが必要とするものでありそして非常に効果的に使用できる。あなたが知る必要があるのはあなたが抽出したい列のインデックスだけです。例えば:
>>> data.iloc[:,[0,3]]
あなたにあげる
a d
0 0.883283 0.100975
1 0.614313 0.221731
2 0.438963 0.224361
3 0.466078 0.703347
4 0.955285 0.114033
5 0.268443 0.416996
6 0.613241 0.327548
7 0.370784 0.359159
8 0.692708 0.659410
9 0.806624 0.875476
次のように、リストの各列の名前を参照することで、DataFrame
の列に沿ってスライスできます。
data = pandas.DataFrame(np.random.Rand(10,5), columns = list('abcde'))
data_ab = data[list('ab')]
data_cde = data[list('cde')]
そして、あなたがここに来て、2つの範囲の列をスライスしてそれらを結合することを探しているなら(私のように)、あなたは次のようなことをすることができます。
op = df[list(df.columns[0:899]) + list(df.columns[3593:])]
print op
これにより、最初の900列と(すべての)3593を超える列を持つ新しいデータフレームが作成されます(データセットに4000列あると仮定します)。
選択的な列のスライスを行うためにさまざまな方法を使用する方法は次のとおりです。 選択的なラベルベース、インデックスベース、および選択的な範囲ベースの列スライス。
In [37]: import pandas as pd
In [38]: import numpy as np
In [43]: df = pd.DataFrame(np.random.Rand(4,7), columns = list('abcdefg'))
In [44]: df
Out[44]:
a b c d e f g
0 0.409038 0.745497 0.890767 0.945890 0.014655 0.458070 0.786633
1 0.570642 0.181552 0.794599 0.036340 0.907011 0.655237 0.735268
2 0.568440 0.501638 0.186635 0.441445 0.703312 0.187447 0.604305
3 0.679125 0.642817 0.697628 0.391686 0.698381 0.936899 0.101806
In [45]: df.loc[:, ["a", "b", "c"]] ## label based selective column slicing
Out[45]:
a b c
0 0.409038 0.745497 0.890767
1 0.570642 0.181552 0.794599
2 0.568440 0.501638 0.186635
3 0.679125 0.642817 0.697628
In [46]: df.loc[:, "a":"c"] ## label based column ranges slicing
Out[46]:
a b c
0 0.409038 0.745497 0.890767
1 0.570642 0.181552 0.794599
2 0.568440 0.501638 0.186635
3 0.679125 0.642817 0.697628
In [47]: df.iloc[:, 0:3] ## index based column ranges slicing
Out[47]:
a b c
0 0.409038 0.745497 0.890767
1 0.570642 0.181552 0.794599
2 0.568440 0.501638 0.186635
3 0.679125 0.642817 0.697628
### with 2 different column ranges, index based slicing:
In [49]: df[df.columns[0:1].tolist() + df.columns[1:3].tolist()]
Out[49]:
a b c
0 0.409038 0.745497 0.890767
1 0.570642 0.181552 0.794599
2 0.568440 0.501638 0.186635
3 0.679125 0.642817 0.697628
その同等物
>>> print(df2.loc[140:160,['Relevance','Title']])
>>> print(df2.ix[140:160,[3,7]])
すべての行が必要であると仮定して、DataFrameから列のサブセットを取得する別の方法は、次のようにすることです。data[['a','b']]
およびdata[['c','d','e']]
数値列インデックスを使用する場合は、次を実行できます。data[data.columns[:2]]
およびdata[data.columns[2:]]
データフレームがそのように見える場合:
group name count
fruit Apple 90
fruit banana 150
fruit orange 130
vegetable broccoli 80
vegetable kale 70
vegetable lettuce 125
oUTPUTは
group name count
0 fruit Apple 90
1 fruit banana 150
2 fruit orange 130
論理演算子np.logical_notを使用する場合
df[np.logical_not(df['group'] == 'vegetable')]
もっと
https://docs.scipy.org/doc/numpy-1.13.0/reference/routines.logic.html
他の論理演算子
logical_and(x1、x2、/ [、out、where、...])x1とx2の真理値を要素ごとに計算します。
logical_or(x1、x2、/ [、out、where、casting、...])x1 OR x2の真理値を要素ごとに計算します。