2017-01-12 14 views
1

に基づいてデータフレームの一部を取得する:Pythonのパンダは、私はこのようになり、データフレームを持つマスク

 TTL1  TTL2  TTL3  TTL4 
0  val1  val2  val3  val4 
1  val1  val2  val3  val4 
2  val1  val2  val3  val4 
3  val1  val2  val3  val4 

とこのようになりますマスク:

[[ 0 0 0 0 ] 
[ 0 0 1 0 ] 
[ 0 1 0 0 ] 
[ 0 0 0 0 ]] 

私はカットしますmain df、マスクの値によって:行に1がある場合は、行を取得します。 ので、出力は次のようになり、他のデータフレームのようになります。

 TTL1  TTL2  TTL3  TTL4 
1  val1  val2  val3  val4 
2  val1  val2  val3  val4 

私はこの行を試みたが、それは動作しません:

df.loc[mask.any(axis=1)] 

任意のアイデアをしてください?

あなたは

+0

私はあなたのコードのsholudの仕事だと思います。エラーとは何ですか? – jezrael

+0

その行がうまくいくはずです。あなたはそれについて動かなかったことを分かち合うことができますか? – piRSquared

+0

これらが実際には整数であり、 'int'の文字列表現ではないことを確認してください。そうでない場合は、 'int/bool'型として型キャストしてからサブセットを実行してください。 –

答えて

2

は、唯一である必要が同じ寸法で感謝しますND df

print (mask.shape) 
(4, 4) 
print (df.shape) 
(4, 4) 

print (df[mask.any(axis=1)]) 
    TTL1 TTL2 TTL3 TTL4 
1 val1 val2 val3 val4 
2 val1 val2 val3 val4 

と同じ:

print (df[mask.any(1)]) 
    TTL1 TTL2 TTL3 TTL4 
1 val1 val2 val3 val4 
2 val1 val2 val3 val4 

commentから別の可能性のある問題 - string値の代わりにint

mask = np.array([[0, 0, 0, 0 ], 
[ 0, 0, 1, 0 ], 
[ 0, 1, 0, 0 ], 
[ 0, 0, 0, 0 ]]).astype(str) 

mask = mask.astype(bool) 
print (df[mask.any(1)]) 
    TTL1 TTL2 TTL3 TTL4 
1 val1 val2 val3 val4 
2 val1 val2 val3 val4 

EDIT:

VA内の文字列nanた場合

mask = np.array(
[['0', 'nan', '0', '0'], 
['0', '0', '1', '0'], 
['0', '1', '0', '0'], 
['0', '0', '0', 'nan']]) 

mask[mask == 'nan'] = 0 
mask = mask.astype(bool) 
print (mask) 
[[False False False False] 
[False False True False] 
[False True False False] 
[False False False False]] 

またはsimplierを:あなたはそれらを交換することができ梅毒

mask = np.array(
[['0', 'nan', '0', '0'], 
['0', '0', '1', '0'], 
['0', '1', '0', '0'], 
['0', '0', '0', 'nan']]) 

mask = mask == '1' 
print (mask) 
[[False False False False] 
[False False True False] 
[False True False False] 
[False False False False]] 
+0

'bool'の最後のオプションは私が望むものですが、私のマスクに' NaN'があれば 'False'の代わりに' True'値を得ますが、どうすれば変更できますか? – TheDaJon

+0

'mask [np.isnan(mask)] = 0'を使うことができます。 – jezrael

+0

は魔法のように動作します。ありがとうございました!私は別の関連する質問があります。たとえば、行番号3のマスクに「1」という値がある場合、行番号3(行1-2、4-5)の前後にある2行を1行に変更しますマスクもどうやってできますか? – TheDaJon

2

locを使用してみてくださいarraymask.any(1)

df.loc[mask.any(1)] 

    TTL1 TTL2 TTL3 TTL4 
1 val1 val2 val3 val4 
2 val1 val2 val3 val4 

セットアップ私はあなたがlocを省略することができると思い

df = pd.DataFrame(
    {'TTL1': ['val1', 'val1', 'val1', 'val1'], 
    'TTL2': ['val2', 'val2', 'val2', 'val2'], 
    'TTL3': ['val3', 'val3', 'val3', 'val3'], 
    'TTL4': ['val4', 'val4', 'val4', 'val4']} 
) 

mask = np.array([ 
     [0, 0, 0, 0], 
     [0, 0, 1, 0], 
     [0, 1, 0, 0], 
     [0, 0, 0, 0], 
    ]) 
関連する問題