307

CSVファイルから機械学習データをロードします。最初の2列は観測値で、残りの列は特徴です。

現在、私は次のことを行っています。

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

これは次のようなものを与えます:

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

このデータフレームを2つのデータフレームにスライスしたいと思います。1つは列を含み、もう1つは列とaを含みbます。cde

次のようなものを書くことはできません

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

最善の方法がわかりません。必要pd.Panelですか?

ちなみに、データフレームのインデックス作成にはかなり一貫性がないことがわかりました。許可されていますdata['a']が、許可されていdata[0]ません。反対側でdata['a':]は、許可されていませんが、許可されていdata[0:]ます。これには実際的な理由がありますか?列がIntによってインデックス付けされている場合、これは本当に混乱します。data[0] != data[0:1]

4

11 に答える 11

299

2017回答-パンダ0.20:.ixは非推奨です。.locを使用する

ドキュメントの非推奨を参照してください

.locラベルベースのインデックスを使用して、行と列の両方を選択します。ラベルは、インデックスまたは列の値です。でスライスすると.loc、最後の要素が含まれます。


foo次の列barを持つDataFrameがあると仮定しますquz:、、、、、、、、。antcatsatdat

# selects all rows and all columns beginning at 'foo' up to and including 'sat'
df.loc[:, 'foo':'sat']
# foo bar quz ant cat sat

.locPythonリストが行と列の両方に対して行うのと同じスライス表記を受け入れます。スライス表記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

行と列でスライスできます。たとえば、ラベルが5vwある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
于 2017-06-24T12:38:58.427 に答える
150

注: .ix Pandasv0.20以降は非推奨になっています。代わりに、必要に応じて.locまたはを使用する必要があり.ilocます。

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 [行スライス、列スライス]は解釈されているものです。パンダのインデックス作成の詳細:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-advanced

于 2012-05-20T22:51:30.290 に答える
88

例として、seabornパッケージのtitanicデータセットを使用してみましょう

# 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を使用(パンダより古い<.20バージョン)

>> titanic.ix[:,[‘sex’,’age’,’fare’]]

また

>> titanic.ix[:,[2,3,6]]

reindexメソッドを使用する

>> titanic.reindex(columns=['sex','age','fare'])
于 2015-11-30T11:32:15.847 に答える
42

また、DataFrameが与えられた場合

データ

あなたの例のように、列aとdのみ(eiの1番目と4番目の列)を抽出したい場合は、パンダのデータフレームからのiloc mothodが必要であり、非常に効果的に使用できます。知っておく必要があるのは、抽出する列のインデックスだけです。例えば:

>>> 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
于 2014-02-25T15:33:29.497 に答える
26

DataFrame次のように、リスト内の各列の名前を参照することで、の列に沿ってスライスできます。

data = pandas.DataFrame(np.random.rand(10,5), columns = list('abcde'))
data_ab = data[list('ab')]
data_cde = data[list('cde')]
于 2012-05-19T15:02:43.627 に答える
24

そして、あなたがここに来て、2つの範囲の列をスライスしてそれらを(私のように)組み合わせるのを探しているなら、あなたは次のようなことをすることができます

op = df[list(df.columns[0:899]) + list(df.columns[3593:])]
print op

これにより、最初の900列と(すべての)列が3593を超える新しいデータフレームが作成されます(データセットに4000列があると仮定します)。

于 2014-10-11T23:21:52.623 に答える
20

選択ラベルベース、インデックスベース、選択範囲ベースの列スライスなど、さまざまな方法を使用して選択列スライスを実行する方法を次に示します。

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
于 2017-06-19T21:50:19.760 に答える
1

同等のもの

 >>> print(df2.loc[140:160,['Relevance','Title']])
 >>> print(df2.ix[140:160,[3,7]])
于 2018-07-05T09:28:25.817 に答える
1

すべての行が必要であると仮定して、DataFrameから列のサブセットを取得する別の方法は、次のようになり
data[['a','b']]ます。数値の列インデックスを使用する場合は、次のようにdata[['c','d','e']]
実行できます。
data[data.columns[:2]]data[data.columns[2:]]

于 2019-07-10T13:38:11.777 に答える
0

データフレームが次のようになっている場合:

group         name      count
fruit         apple     90
fruit         banana    150
fruit         orange    130
vegetable     broccoli  80
vegetable     kale      70
vegetable     lettuce   125

と出力は次のようになります

   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

他の論理演算子

  1. logic_and(x1、x2、/ [、out、where、...])x1ANDx2の真理値を要素ごとに計算します。

  2. logic_or(x1、x2、/ [、out、where、casting、...])x1またはx2の真理値を要素ごとに計算します。

  3. logic_not(x、/ [、out、where、casting、...])NOTxの真理値を要素ごとに計算します。
  4. logic_xor(x1、x2、/ [、out、where、..])x1XORx2の真理値を要素ごとに計算します。
于 2018-08-08T16:54:02.273 に答える
0

あなたは方法を使うことができますtruncate

df = pd.DataFrame(np.random.rand(10, 5), columns = list('abcde'))

df_ab = df.truncate(before='a', after='b', axis=1)
df_cde = df.truncate(before='c', axis=1)
于 2021-10-25T22:24:57.590 に答える