2017-06-07 17 views
1

私は、pandas DataFrameの1つの列にスループット値のリストを持っています。私は、そのしきい値のパーセンテージとしてのしきい値からのバラツキを計算したいと思います。パンダの行計算の最小値を計算する

したがって、しきい値が2と7の場合は、次の関数の最小値を計算します。

(df.throughput - 2)/2 
(df.throughput - 7)/7 

x throughtput 
1 3 
4 4 
7 9 

次のように新しい列を作成しようとしましたが、エラーが発生しています。私はここに欠けている何かが本当に明白なように落ちた。

df['pct'] = np.min( (df.throughput-2)/2, (df.throughput - 7)/7 ) 
df['pct'] = np.min( (df['throughput']-2)/2, (df['throughput'] - 7)/7 ) 
'Series' objects are mutable, thus they cannot be hashed 

答えて

1

あなたは、新しいSeriesを作成し、それらを比較し、新しい列のnumpy.whereを使用することができます。

a = (df['throughtput'] - 2)/2 
b = (df['throughtput'] - 7)/7 
df['pct'] = np.where(a < b, a, b) 
print (df) 
    x throughtput  pct 
0 1   3 -0.571429 
1 4   4 -0.428571 
2 7   9 0.285714 

ソリューションconcatとし、DataFrame.min

a = (df['throughtput'] - 2)/2 
b = (df['throughtput'] - 7)/7 
df['pct'] = pd.concat([a,b], axis=1).min(axis=1) 
print (df) 
    x throughtput  pct 
0 1   3 -0.571429 
1 4   4 -0.428571 
2 7   9 0.285714 

それともnumpy.column_stackで2次元配列を作成し、分を得るにはnumpy.amin

a = (df['throughtput'] - 2)/2 
b = (df['throughtput'] - 7)/7 
df['pct'] = np.amin(np.column_stack([a,b]), axis=1) 
print (df) 
    x throughtput  pct 
0 1   3 -0.571429 
1 4   4 -0.428571 
2 7   9 0.285714 

a = (df['throughtput'].values - 2)/2 
b = (df['throughtput'].values - 7)/7 
df['pct'] = np.amin(np.column_stack([a,b]), axis=1) 
print (df) 
    x throughtput  pct 
0 1   3 -0.571429 
1 4   4 -0.428571 
2 7   9 0.285714 

タイミング

N = 1000000 
#N = 10 
df = pd.DataFrame({'x': np.random.randint(10,size=N), 
        'throughtput':np.random.randint(10,size=N)}) 
print (df) 

In [50]: %%timeit 
    ...: a = (df['throughtput'] - 2)/2 
    ...: b = (df['throughtput'] - 7)/7 
    ...: df['pct'] = np.where(a < b, a, b) 
    ...: 
10 loops, best of 3: 21.1 ms per loop 

In [51]: %%timeit 
    ...: a = (df['throughtput'] - 2)/2 
    ...: b = (df['throughtput'] - 7)/7 
    ...: df['pct'] = pd.concat([a,b], axis=1).min(axis=1) 
    ...: 
10 loops, best of 3: 56.4 ms per loop 

In [52]: %%timeit 
    ...: a = (df['throughtput'] - 2)/2 
    ...: b = (df['throughtput'] - 7)/7 
    ...: df['pct'] = np.amin(np.column_stack([a,b]), axis=1) 
    ...: 
10 loops, best of 3: 35.1 ms per loop 


In [53]: %%timeit 
    ...: a = (df['throughtput'].values - 2)/2 
    ...: b = (df['throughtput'].values - 7)/7 
    ...: df['pct'] = np.amin(np.column_stack([a,b]), axis=1) 
    ...: 
10 loops, best of 3: 38.5 ms per loop 

もう一つの答えTiny.Dによって:

In [54]: %%timeit 
    ...: df['cal_1'] = (df.throughtput - 2)/2 
    ...: df['cal_2'] = (df.throughtput - 7)/7 
    ...: df['pct'] = df[['cal_1','cal_2']].min(axis=1) 
    ...: df[['x','throughtput','pct']] 
    ...: 
10 loops, best of 3: 73.7 ms per loop 

In [55]: %%timeit 
    ...: df['pct']=[min(i,j) for i,j in (zip((df.throughtput - 2)/2,(df.throughtput - 7)/7))] 
    ...: 
1 loop, best of 3: 435 ms per loop 
0

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

df['pct'] = [min(i,j) for i,j in (zip((df.throughput - 2)/2,(df.throughput - 7)/7))] 
df 

出力は次のようになります。

throughput x pct 
0 3   1 -0.571429 
1 4   4 -0.428571 
2 9   7 0.285714 

か:

df['cal_1'] = (df.throughput - 2)/2 
df['cal_2'] = (df.throughput - 7)/7 
df['pct'] = df[['cal_1','cal_2']].min(axis=1) 
df[['x','throughput','pct']] 

出力は次のようになります。

x throughput pct 
0 1 3   -0.571429 
1 4 4   -0.428571 
2 7 9   0.285714 
関連する問題