web-dev-qa-db-ja.com

データフレームの最後のn列を選択し、最後のn列を除外する

方法:

  1. データフレームの最後の3列を選択して、新しいデータフレームを作成しますか?

私は試した:

y = dataframe.iloc[:,-3:]
  1. 最後の3列を除外して新しいデータフレームを作成しますか?

私は試した:

X = dataframe.iloc[:,:-3]

これは正しいです?

コードで配列の次元エラーがさらに発生しており、この手順が正しいことを確認したいと思います。

ありがとうございました

17
Toly

ただ:

_y = dataframe[dataframe.columns[-3:]]
_

これは列をスライスするので、dfからサブ選択できます

例:

_In [221]:
df = pd.DataFrame(columns=np.arange(10))
df[df.columns[-3:]]

Out[221]:
Empty DataFrame
Columns: [7, 8, 9]
Index: []
_

ここでの問題は、dfの一部を取得したためにビューが返されたが、残りのコードが何をしているかに応じて警告が発生することだと思います。 .copy()を呼び出して警告を削除すると、明示的なコピーを作成できます。

したがって、コピーを取った場合、割り当てはコピーにのみ影響し、元のdfには影響しません。

_In [15]:
df = pd.DataFrame(np.random.randn(5,10), columns= np.arange(10))
df

Out[15]:
          0         1         2         3         4         5         6  \
0  0.568284 -1.488447  0.970365 -1.406463 -0.413750 -0.934892 -1.421308   
1  1.186414 -0.417366 -1.007509 -1.620530 -1.322004  0.294540  1.205115   
2 -1.073894 -0.214972  1.516563 -0.705571  0.068666  1.690654 -0.252485   
3  0.923524 -0.856752  0.226294 -0.660085  1.259145  0.400596  0.559028   
4  0.259807  0.135300  1.130347 -0.317305 -1.031875  0.232262  0.709244   

          7         8         9  
0  1.741925 -0.475619 -0.525770  
1  2.137546  0.215665  1.908362  
2  1.180281 -0.144652  0.870887  
3 -0.609804 -0.833186 -1.033656  
4  0.480943  1.971933  1.928037  

In [16]:    
y = df[df.columns[-3:]].copy()
y

Out[16]:
          7         8         9
0  1.741925 -0.475619 -0.525770
1  2.137546  0.215665  1.908362
2  1.180281 -0.144652  0.870887
3 -0.609804 -0.833186 -1.033656
4  0.480943  1.971933  1.928037

In [17]:    
y[y>0] = 0
print(y)
df

          7         8         9
0  0.000000 -0.475619 -0.525770
1  0.000000  0.000000  0.000000
2  0.000000 -0.144652  0.000000
3 -0.609804 -0.833186 -1.033656
4  0.000000  0.000000  0.000000
Out[17]:
          0         1         2         3         4         5         6  \
0  0.568284 -1.488447  0.970365 -1.406463 -0.413750 -0.934892 -1.421308   
1  1.186414 -0.417366 -1.007509 -1.620530 -1.322004  0.294540  1.205115   
2 -1.073894 -0.214972  1.516563 -0.705571  0.068666  1.690654 -0.252485   
3  0.923524 -0.856752  0.226294 -0.660085  1.259145  0.400596  0.559028   
4  0.259807  0.135300  1.130347 -0.317305 -1.031875  0.232262  0.709244   

          7         8         9  
0  1.741925 -0.475619 -0.525770  
1  2.137546  0.215665  1.908362  
2  1.180281 -0.144652  0.870887  
3 -0.609804 -0.833186 -1.033656  
4  0.480943  1.971933  1.928037  
_

ここでは警告は出されず、元のdfはそのままです。

16
EdChum

これは、整数インデックスを使用するためです(ixは、位置ではなく-3を超えるラベルでインデックスを選択します。これは設計によるものです。pandas "gotchas" *の整数インデックスを参照してください)。

* pandasの新しいバージョンでは、位置またはラベルとしてのixのあいまいさを取り除くためにlocまたはilocを優先します。

df.iloc [-3:]ドキュメントを参照してください。

Wesが指摘しているように、この特定のケースでは、tailを使用するだけです!

また、Pandasでは、ilocは境界外のアクセスでIndexErrorを発生させますが、.head()と.tail()は発生しません:

pd .バージョン '0.12.0' df = pd.DataFrame([{"a":1}、{"a":2}])df.iloc [-5:] ... IndexError:スライスの範囲外(終了)df.tail(5)a 0 1 1 2古い答え(非推奨メソッド):

Irows DataFrameメソッドを使用して、このあいまいさを克服できます。

In [11]:df1.irow(slice(-3、None))Out [11]:STK_ID RPT_Date TClose販売割引8 568 20080331 38.75 12.668 NaN 9 568 20080630 30.09 21.102 NaN 10 568 20080930 26.00 30.769 NaN注:シリーズには同様のigetメソッド。

1
Ananta R. Pant

最も効率的な方法:

1。最後のn列を選択

df1 = df.iloc [:、-n:]

2。最後のn列を除外

df1 = df.iloc [:、:-n]

0
Noah Sheldon