2017-05-29 3 views
1

dictまたはcomprehensionリストを渡すデータフレーム内の行を選択する。dictでデータフレームを選択するにはパラメータまたは理解リストを渡す。python pandas

私は数百万行のデータフレームを持っていますが、パラメータのリストに対応するこのデータフレームの一部だけを選択する関数を作成します。それを複雑にするには、データフレームとリストを渡す必要がありますが、このリストにはNaN値と '0'を含めることができます。したがって、適切な行を選択するには、このエントリを削除する必要があります。

エントリーリスト:

b = ['MUSTANG', 'Coupé', '0', np.nan, np.nan] 

    AGE KM  Brand Model   Liter  Bodycar Power 
0 2.0 10000.0 FORD MUSTANG   5.0  Coupé 421 
1 2.0 10000.0 FORD MUSTANG   5.0  Coupé 421 
2 5.0 10400.0 FORD MUSTANG   5.0  Coupé 421 
3 5.0 10400.0 FORD MUSTANG   5.0  Coupé 421 
4 16.0 20700.0 FORD MUSTANG   3.7  Coupé 317 
5 7.0 23300.0 FORD MUSTANG   3.7     317 
6 7.0 23300.0 FORD MUSTANG   2.3  Coupé 301 
7 7.0 23300.0 FORD MUSTANG   5.0     421 
... 

I started a function to remove the part of the list useless and try to select the proper rows but failed... 

    def func_mcclbp_incomp(df, mcclbp): 
    ind = [] 

    mcclbp = [i if type(i) == str else '0' for i in mcclbp] 
    ind = [i for i, x in enumerate(mcclbp) if x=='0'] 

    head = ['Brand','Model','Bodycar','Liter', 'Power'] 
    mmcclbp = {head[0]:mcclbp[0], head[1]:mcclbp[1], head[2]:mcclbp[2], \ 
      head[3]:mcclbp[3], head[4]:mcclbp[4]} 
    for i in ind: 
     del mmcclbp[head[i]] 
    df = df[df[head[i]==mccblp[i]] for i in mmcclbp.key()] 
    return df 

は、私が理解リストを試みたが、パンダは私にエラーを送信します。私はKeyError例外を持っている辞書を渡してみました

File "<ipython-input-235-6f78e45f59d4>", line 1 
df = df[df[head[i].isin(mccblp[i]) for i in mmcclbp.keys()]] 
            ^
SyntaxError: invalid syntax 

私はBを使用する場合に必要な出力は次のとおりです。

 AGE KM  Brand Model   Liter  Bodycar Power 
0 2.0 10000.0 FORD MUSTANG   5.0  Coupé 421 
1 2.0 10000.0 FORD MUSTANG   5.0  Coupé 421 
2 5.0 10400.0 FORD MUSTANG   5.0  Coupé 421 
3 5.0 10400.0 FORD MUSTANG   5.0  Coupé 421 
4 16.0 20700.0 FORD MUSTANG   3.7  Coupé 317 
6 7.0 23300.0 FORD MUSTANG   2.3  Coupé 301 

私は次のように別の値にBを変更した場合:

b = ['FORD', 'MUSTANG', 'Coupé', '3.7', '317'] 

結果は次のようになります。

 AGE KM  Brand Model   Liter  Bodycar Power 
4 16.0 20700.0 FORD MUSTANG   3.7  Coupé 317 

誰かが知っていますリストに対応する行を自動的に選択する方法は?

お返事ありがとうございます。

Chris。

+0

あなたは 'B = [「MUSTANG」、「クーペ」から所望の出力を追加することができ、 '0'、np.nan、np.nan] 'とあなたのサンプルデータ? – jezrael

+0

はい、私は入力を書くのを忘れて申し訳ありません...編集はあなたが何をする必要があるかを示しています。 –

+0

さらに最初の出力を説明することができますか?なぜ、 '0'や' nan'sがあるとデータを取得するのですか? – jezrael

答えて

1

DataFrame.allでフィルタリングにdictを使用すると、マスクとフィルタの行ごとにTrue値をチェックすると、boolean indexingとなります。 dictのすべてvaluesstringあるため
はまた、astypeによってDataFramestring秒のすべての値必要な変換すぎるよ:

d = {'Brand':'FORD', 'Model':'MUSTANG', 'Bodycar':'Coupé', 'Liter':'3.7', 'Power':'317'} 

print (df.astype(str)[list(d)] == pd.Series(d)) 
    Bodycar Brand Liter Model Power 
0  True True False True False 
1  True True False True False 
2  True True False True False 
3  True True False True False 
4  True True True True True 
6  True True False True False 

mask = (df.astype(str)[list(d)] == pd.Series(d)).all(axis=1) 
print (mask) 
0 False 
1 False 
2 False 
3 False 
4  True 
6 False 
dtype: bool 

df1 = df[mask] 
print (df1) 
    AGE  KM Brand Model Liter Bodycar Power 
4 16.0 20700.0 FORD MUSTANG 3.7 Coupé 317 
+0

ありがとうございました!それは完璧にうまくいく!!!!! –

+0

もう一度ありがとう!君も :) –

関連する問題