2016-11-21 9 views
0

に適用され、各キーは、整数0, ..., 999であり、各値は、このようなデータフレームです:パンダ:条件に基づいて選択した行は、データフレームの辞書での作業列

 A   B 
1 10010001 17 
2 10020001 5 
3 10020002 11 
4 10020003 2 
5 10030001 86 
... 

私はを反復処理する必要があります新しいデータフレームにまとめるには、列Aの3桁目と4桁目がすべて02に等しくなるようにします。私の例では、2行、3行、および4行だけが新しいデータフレームを形成します。列Aのすべての値は文字列です。

pandasの中でこれを行う最も効率的な方法は何でしょうか?

+0

ここでディクテーションキーにはどのような役割がありますか? – wflynny

+0

いいえ、そうではありません。現在のところ、これらのデータフレームは「n」個のデータフレームを表しますが、このタスクの最後には「選択済み」データフレームが1つだけあります。 – FaCoffee

答えて

2

どうdがあなたのdictで、以下のようなものについて:3回とキー0-2

を繰り返し、あなたのサンプルデータフレームからなるあなたのdictで

pd.concat((v[v.A.str[2:4] == '02'] for v in d.itervalues())) 

d = dict(zip(range(3), [df]*3)) 

この結果は、

  A B 
2 10020001 5 
3 10020002 11 
4 10020003 2 
2 10020001 5 
3 10020002 11 
4 10020003 2 
2 10020001 5 
3 10020002 11 
4 10020003 2 

これは、代わりにジェネレータ式を使用しているため、行のリストを作成したり、リストの内包表記を使用するよりも効率的で、より多くのメモリでなければなりません。また、(データ値が標準化されていると仮定して)直接インデックス作成のためにregexを使用するよりも速くなければなりません。


結合配列のインデックスが気に入らない場合は、常にreset_index()となります。たとえば:

y = pd.concat((v[v.A.str[2:4] == '02'] for v in d.itervalues())) 
y.reset_index.drop('index', axis=1) 

      A B 
0 10020001 5 
1 10020002 11 
2 10020003 2 
3 10020001 5 
4 10020002 11 
5 10020003 2 
6 10020001 5 
7 10020002 11 
8 10020003 2 
+0

Uhm ...すてきなスニペットだが、これは行を繰り返す - 私が必要としないもの。 – FaCoffee

+0

「行を繰り返す」とは、インデックス値が繰り返されるか、データフレームの実際の行が繰り返されることですか?前者の場合、 'reset_index()'を使います。後では、サンプルデータフレームを3回コピーしただけで行が繰り返されるので、繰り返してください。 – wflynny

+0

ああ、申し訳ありませんが、私は 'reset_index()'を参照していました。 – FaCoffee

1

これを試してみてください。

keep = [] #hold all the rows you want to keep 
for key in frame_dict.keys(): 
    frame = frame_dict[key] 
    keep.append(
     frame[frame['A'].astype(str).str.contains('^\d\d02', regex=True)].copy() 
    ) #append the rows matching regex for start of word (^), digit (\d), digit (\d), 02 
final = pd.concat(keep) #concatenate the matching rows 
2

最初の行は、A列の3番目と4番目の文字をチェックし、「02」を使って何のための真/ Falsesのブールインデクサを返すインデクサーを作成します。

2行目は、そのインデクサを適用した後にオリジナルから新しいデータフレームを作成します。

indexer = df['A'].apply(lambda x: x[2:4] == '02') 
results = df.loc[indexer] 

編集:データフレームの辞書に適合した上記の解決策があります。

frames = list() 
for k in dictionary.keys(): 
    df = dictionary[k] 
    indexer = df['A'].apply(lambda x: x[2:4] == '02') 
    results = df.loc[results] 
    frames.append(results) 
output = pd.concat(frames) 
+1

私は、辞書内のすべてのデータフレームを反復処理するようにコードを拡張する必要があると思います。それ以外の場合は、このコードは繰り返し実行されたときに最後に検索されたデータフレームの結果を辞書に格納します。 – SpiderWasp42

+0

うん、ありがとう。私が投稿した後までそれを忘れてしまった。仕様のその部分を扱う上記の編集を見てください。 – cggarvey

+0

問題ありません!今完璧に見える。乾杯! – SpiderWasp42

関連する問題