df1.iloc[,3:7]
は間違いです。df1.iloc[:,3:7]
とする必要があります。
それ以外は基本的に質問文の発想で良いと思います。
python
1>>> import pandas as pd
2>>> import numpy as np
3>>> df = pd.DataFrame(np.arange(30).reshape(3, 10), columns=list("abcdefghij"))
4>>> df
5 a b c d e f g h i j
60 0 1 2 3 4 5 6 7 8 9
71 10 11 12 13 14 15 16 17 18 19
82 20 21 22 23 24 25 26 27 28 29
9>>> index_of_c = list(df.columns).index("c")
10>>> index_of_c
112
12>>> df.iloc[:,index_of_c:index_of_c+5]
13 c d e f g
140 2 3 4 5 6
151 12 13 14 15 16
162 22 23 24 25 26
余談
スライスは言語仕様的にはこうなっていて、
6. 式 (expression) — Python 3.6.5 ドキュメント #slicings
[]
の中身を適当に変換して__getitem__
等のメソッドに渡すことで実現されています。せっかくなので中身を見てみると理解が深まります。
python
1>>> class Hoge:
2... def __getitem__(self, k):
3... return k
4...
5>>> h = Hoge()
6>>> h[0] # これはスライスではなく添字表記だが、扱われ方は大差ない
70
8>>> h[1:3]
9slice(1, 3, None)
10>>> h[:,3:7]
11(slice(None, None, None), slice(3, 7, None))
12>>> h[1,2,3]
13(1, 2, 3)
14>>> h[1,2:3,:]
15(1, slice(2, 3, None), slice(None, None, None))
カンマで区切って複数書いた場合、中身が丸ごとtupleに化けます。あとはこれを受け取ったpandasなどの__getitem__
などがよしなに処理するという仕組みです。
tupleにする以上、カンマの前になにか入れる必要があり、:
と書くとslice(None, None, None)
に化けて万事解決という訳です。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/21 12:18