2016-08-08 7 views
1

GPSパスといくつかの属性を持つ大規模なDataFrameがあります。パスのいくつかのセクションは、私が分析する必要があるものです。これらのセクションのみを新しいDataFrameにサブセット化したいと思います。私はその時点で1つのセクションをサブセット化することができますが、アイデアはすべてそれらを持ち、元のインデックスを持つことです。パンダのインデックスで行の複数のセクションを選択

問題はに似ています。

import pandas as pd 
df = pd.DataFrame({'A':[0,1,2,3,4,5,6,7,8,9],'B':['a','b','c','d','e','f','g','h','i','j']}, 
        index=range(10,20,)) 

私が欲しいOのような何かを得る:

cdf = df.loc[[11:13] & [17:20]] # SyntaxError: invalid syntax 

望ましい結果:

A B 
11 1 b 
12 2 c 
13 3 d 
17 7 h 
18 8 i 
19 9 j 

私が知っている例がcdf = df.loc[[11,12,13,17,18,19],:]と簡単ですが、元の問題では何千もの行があり、いくつかのエントリーはすでに削除されていますリストポイントはむしろオプションではありません。

答えて

3

concatとの一つの可能​​な解決策:

cdf = pd.concat([df.loc[11:13], df.loc[17:20]]) 
print (cdf) 
    A B 
11 1 b 
12 2 c 
13 3 d 
17 7 h 
18 8 i 
19 9 j 

rangeのもう一つの解決策:

cdf = df.ix[list(range(11,14)) + list(range(17,20))] 
print (cdf) 
    A B 
11 1 b 
12 2 c 
13 3 d 
17 7 h 
18 8 i 
19 9 j 
4

あなたがスライス連結するnp.r_を使用することができます。しかし、

In [16]: df.loc[np.r_[11:13, 17:20]] 
Out[16]: 
    A B 
11 1 b 
12 2 c 
17 7 h 
18 8 i 
19 9 j 

注意を、その df.loc[A:B]ABのラベルを選択し、Bを含む。 np.r_[A:B]ABの配列を返します。Bは除きます。 Bを含めるには、np.r_[A:B+1]を使用する必要があります。

df.loc[A:B]のようにスライスを渡した場合、df.locdf.indexにないラベルを無視します。対照的に、df.loc[np.r_[A:B]]などの配列を渡した場合、df.locは、df.indexにない配列の各値に対してNaNで埋められた新しい行を追加することがあります。

このように所望の結果を得るために、あなたはスライスの右端点を調整し、df.indexのメンバーシップをテストするためにisinを使用する必要があります:

In [26]: df.loc[df.index.isin(np.r_[11:14, 17:21])] 
Out[26]: 
    A B 
11 1 b 
12 2 c 
13 3 d 
17 7 h 
18 8 i 
19 9 j 
+0

おかげで、興味深いソリューション – tomasz74

関連する問題