1. ホーム
  2. パイソン

[解決済み】pandasでdataframeのcolumn-slicesを取得する方法

2022-04-15 23:31:34

質問

CSVファイルから機械学習データを読み込みました。最初の2列は観測値で、残りの列は特徴量である。

現在、以下のようにしています。

data = pandas.read_csv('mydata.csv')

のようなものが得られます。

data = pandas.DataFrame(np.random.rand(10,5), columns = list('abcde'))

このデータフレームを2つのデータフレームにスライスしたいと思います。 ab というカラムを含むものと c , de .

のような書き方はできません。

observations = data[:'c']
features = data['c':]

どのような方法がベストなのか、よくわかりません。を必要とするのでしょうか? pd.Panel ?

ところで、dataframeのインデックスはかなり矛盾していると思うのですが。 data['a'] は許可されますが data[0] はありません。反対側では data['a':] は許されないが data[0:] があります。 何か実用的な理由があるのでしょうか?カラムがIntでインデックスされている場合、これは非常に紛らわしいです。 data[0] != data[0:1]

どうすればいい?

2017 Answer - pandas 0.20: .ix は非推奨です。.locを使用します。

をご覧ください。 docsのdeprecationを参照してください。

.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

行と列でスライスすることができます。例えば、5行のラベルがある場合 v , w , x , y , z

# slice from 'w' to 'y' and 'foo' to 'ant' by 3
df.loc['w':'y', 'foo':'ant':3]
#    foo ant
# w
# x
# y