グループ化されたデータフレームとポストフィルタとitertoolsの組み合わせを最適化します

Akashさんクマール:

私は、データフレームとしてを持っています

Locality     money
1            3
1            4
1            10
1            12
1            15
2            16
2            18

私がしなければならない交換との組み合わせでマネーコラムのをGROUPBYビュー地域に及び、フィルタお金差に。ターゲットは次のようでなければなりません

Locality     money1     money2
1            3          3 
1            3          4
1            4          4
1            10         10
1            10         12
1            10         15
1            12         12
1            12         15
1            15         15
2            16         16
2            16         18
2            18         18

組み合わせが6未満の差を有する同一ページ上の値と値に適用されることに留意されたいです。

私の現在のコードがあります

from itertools import combinations_with_replacement
import numpy as np
import panda as pd

def generate_graph(input_series, out_cols):
    return pd.DataFrame(list(combinations_with_replacement(input_series, r=2)), columns=out_cols)

df = (
    df.groupby(['Locality'])['money'].apply(
        lambda x: generate_graph(x, out_cols=['money1', 'money2'])
    ).reset_index().drop(columns=['level_1'], errors='ignore')
)

# Ensure the Distance between money is within the permissible limit
df = df.loc[(
    df['money2'] - df['money1'] < 6
)]

問題は、私はほとんど取る100000行のDATAFRAME持っている、である33秒を私のコードを処理することを。私はおそらくnumpyのを使って自分のコードにかかる時間を最適化する必要があります。私は、余分なスペースと時間がかかりGROUPBYとポストフィルタを最適化するために探しています。サンプルデータでは、あなたは、データフレームを生成するには、このコードを使用することができます。

# Generate dummy data
t1 = list(range(0, 100000))
b = np.random.randint(100, 10000, 100000)
a = (b/100).astype(int)

df = pd.DataFrame({'Locality': a, 'money': t1})
df = df.sort_values(by=['Locality', 'money'])
RomanPerekhrest:

両方の走行時間のスピードアップを獲得し、スペースの消費量を減らすために:

代わりに、ポストフィルタリング -拡張機能(たとえば適用combine_valuesにデータフレームを生成する)ジェネレータ式既に濾過(条件による)の組み合わせを得ています。

factor下記に示すデフォルト引数である許容限界

In [48]: def combine_values(values, out_cols, factor=6): 
    ...:     return pd.DataFrame(((m1, m2) for m1, m2 in combinations_with_replacement(values, r=2)  
    ...:                         if m2 - m1 < factor), columns=out_cols) 
    ...:                                                                                                                                         

In [49]: df_result = ( 
    ...:     df.groupby(['Locality'])['money'].apply( 
    ...:         lambda x: combine_values(x, out_cols=['money1', 'money2']) 
    ...:     ).reset_index().drop(columns=['level_1'], errors='ignore') 
    ...: ) 

実行時間のパフォーマンス:

In [50]: %time df.groupby(['Locality'])['money'].apply(lambda x: combine_values(x, out_cols=['money1', 'money2'])).reset_index().drop(columns=['l
    ...: evel_1'], errors='ignore')                                                                                                              
CPU times: user 2.42 s, sys: 1.64 ms, total: 2.42 s
Wall time: 2.42 s
Out[50]: 
        Locality  money1  money2
0              1      34      34
1              1     106     106
2              1     123     123
3              1     483     483
4              1     822     822
...          ...     ...     ...
105143        99   99732   99732
105144        99   99872   99872
105145        99   99889   99889
105146        99   99913   99913
105147        99   99981   99981

[105148 rows x 3 columns]

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=25027&siteId=1