2017-11-26 14 views
0

Pythonでは、私はpandasデータフレームを持っています。列Aの1つの値をフィルタリングしたい。Python Pandas Dataframe:最大値をより小さくする

Aが '5'より小さい最も高い値である行を探しています(列Aに値 '1'、 '2'、 '4'、 '7'がある場合は、 '4'でなければなりません)。別の条件も存在する。

次の文は機能しません。

動作するように、どのように最大条件を変更する必要がありますか?

df_new = df[(df['some_other_column'] < XYZ) & max(df['A'] <= '5')] 

答えて

2

使用np.searchsorted -

df 

    x 
0 1 
1 2 
2 4 
3 7 

df.iloc[(np.searchsorted(df.x.values, 5) - 1).clip(0)] 

    x 
2 4 

タイミング

df = pd.DataFrame({'x' : np.arange(100000)}) 
%%timeit 
x = df.x 
g = x[x <= 12345].max() 
df[x == g] 

1000 loops, best of 3: 1.27 ms per loop 
%timeit df.iloc[(np.searchsorted(df.x.values, 12345) - 1).clip(0)] 
10000 loops, best of 3: 139 µs per loop 

比較はありません。searchsortedを使う方がはるかに高速です。

+0

列がソートされていると仮定して使用していませんか? –

+0

確かに。しかし、ソートされたインデックスを "ソーター"引数として関数に渡すと、問題を最小限に抑えることができます。 –

+0

また、多くとも1つの行が返されますが、これは望ましくない可能性があります。また、あなたの答えをソーターで更新して、世代部分の 'np.random.permutation'をx列に追加してください。インデックスが正確に値と等しいときに、このビットを最適化する方法について興味があります。 –

1

その他の条件は基本的な質問には実際には関係しないため、無視します。

In [1]: import pandas as pd 
    ...: df = pd.DataFrame({'x': [1, 2, 4, 7]}) 
    ...: x = df['x'] 
    ...: greatest_smaller_than_5 = x[x <= 5].max() 
    ...: df[df['x'] == greatest_smaller_than_5] 
    ...: 
Out[1]: 
    x 
2 4 

P.S. - :以下

トリック(貧しい変数の命名をご容赦を)行いますあなたの質問では、それはsmaller thanと言いますが、あなたのコードはそれがsmaller or equal toであることを示唆しています。

+0

この回答はパフォーマンスの面で最適です。 searchsortedを使って私の答えを見てください。 –

関連する問題