2017-11-23 22 views
1

データフレームで操作しようとしていますが、組み込みのPandas Operationsを使用して問題を解決する方法がわかりません(実際には私のコードは私はより洗練されたソリューションを構築しようとしています)。私はO1/W1の分割に基づいているがC1の値に応じoriginal_dfに新しい列を内蔵する必要がPandasの条件付き行に基づく新しい列

original_df = [o1, o2, o3, o4] 
weights_df = [w1, w2, w3, w4] 
conditions_df = [c1, c2, c3, c4] 

説明カラムで定義された次のデータフレーム、与えられ withは値を取る "+"または " - "私は-o1/w1操作を行う必要があります。

は限り私が行ったようだった。

もちろん、私は二つの用語を分けが、条件を適用せず、私はマップを行うと機能を適用しようとしているが、私はどのようにわからない
orignal_df['newcolumn'] = original_df/weights_df 

関数に3番目の列を追加できます。

+0

'original_df = [o1、o2、o3、o4]'はDataFramesのリストですか?または、1つのデータフレームの列名? – jezrael

+0

データフレームの列名は – Melvin

+0

です。データのサイズは? – jezrael

答えて

0

あなたは条件によってマスクにnumpy.whereを使用することができます。

#data from lisa answer 
#df = pd.DataFrame({'x':original_df, 'y':weights_df, 'z':conditions_df}) 

df['new_feature'] = df['x']/df['y'] * np.where(df['z'] > 2, 1, -1) 
print (df) 
    x y z new_feature 
0 100 10 1  -10.0 
1 200 20 2  -10.0 
2 300 30 3   10.0 
3 400 40 4   10.0 

タイミング

#4k rows 
df = pd.concat([df]*1000).reset_index(drop=True) 

#lisa answer 
In [95]: %timeit df['new_feature1'] = df.apply(lambda p: div(p['x'], p['y'], p['z']), axis=1) 
10 loops, best of 3: 123 ms per loop 

In [96]: %timeit df['new_feature2'] = df['x']/df['y'] * np.where(df['z'] > 2, 1, -1) 
1000 loops, best of 3: 595 µs per loop 
+0

データのサイズについては可変ですが、クラスタリングプロファイリング用のアルゴリズムを作成しています。サイズはデータセットの観測数に依存します。私はnumpyを適用しようとします。また、ありがとう! – Melvin

+0

OK、 'apply solution'が必要ですか?はいの場合は問題ありません。私のソリューションupvoteも可能ですか?または、 'apply'が遅いので私の解決策を変更する必要がありますか?もっと説明できますか? – jezrael

1
original_df = [100, 200, 300, 400] 
weights_df = [10, 20, 30, 40] 
conditions_df = [1, 2, 3, 4] 

df = pd.DataFrame({'x':original_df, 'y':weights_df, 'z':conditions_df}) 
def div(x, y, z): 
    if z > 2: 
     return float(x/y) 
    else: 
     return float(-1*x/y) 

df['new_feature'] = df.apply(lambda p: div(p['x'], p['y'], p['z']), axis=1) 

これが解決の一つの方法です。 conditions_dfに '+'/' - 'が含まれている場合は、それに応じてdef div(x, y, z)の条件を変更することができます。

+0

3つのデータフレームを1つにまとめることができます。ありがとう:) – Melvin

+0

私はそれが遅いので、ここで '適用'は必要ではないと思います。私の答えのタイミングをチェックしてください。 – jezrael

+1

@jezraelそうです。ありがとう! – lisa

関連する問題