2016-09-29 3 views
2

私は現在、パンダに関するいくつかのことを考えています。私は次の問題を解決する最も効果的な方法が何であるか考えています。ここでは簡単な例を示します。パンダを使用してインデックス/カラムへのアクセスを「適用」しますか?

は、私は、データフレーム内のいくつかのデータを持っていると言う:

import pandas as pd 
import numpy as np 
df = pd.DataFrame(np.random.randint(0,10,size=(10, 4)), columns=['a','b','c','d'], 
        index=np.random.randint(0,10,size=10)) 

このデータは、このようなものになります。

a b c d 
1 0 0 9 9 
0 2 2 1 7 
3 9 3 4 0 
2 5 0 9 4 
1 7 7 7 2 
6 4 4 6 4 
1 1 6 0 0 
7 8 0 9 3 
5 0 0 8 3 
4 5 0 2 4 

を今私は(データフレーム内の各値にいくつかの機能を適用したいです例えば以下のように)、結果の出力としてデータフレームを戻す。トリッキーな部分は、私が現在適用しているインデックスの値によって、適用する関数です。私は、データフレーム内の個々のセルに関数を適用したい場合

def f(cell_val,row_val): 
    try: 
     return cell_val/row_val 
    except ZeroDivisionError: 
     return -1 

通常、私はちょうど「F」にapplymap呼ぶだろう。 2番目の引数(この例ではrow_val)を渡さなければならない場合でも、引数が固定された数であれば、 "lambda x:f(x、i)"のようなラムダ式を書くことができます。私が望んだ番号。しかし、私の2番目の引数は、私が現在関数を呼び出しているデータフレームの行によって異なります。つまり、applymapだけでは使えません。

このような問題を効率的に解決する方法を教えてください。私はこれを行うにはいくつかの方法が考えられますが、どれも「正しい」と感じる人はいません。個々の値をループして1つ1つ置き換えることはできますが、それは本当に扱いにくく遅いようです。また、(セルの値、行の値)タプルを含む完全に別のデータフレームを作成し、タプルのデータフレームに組み込みのpandas applymapを使用するようなこともできます。しかし、それはかなりハッキーなようだと私はまた、余分なステップとして完全に別のデータフレームを作成しています。

これに対して、より良い解決策が必要です(私のデータフレームが非常に大きくなる可能性があるため、速い解決策があります)。

+0

申し訳ありません: 'df.div(df.index.to_series()、axis = 0)'? – EdChum

答えて

2

IIUCあなたはaxis=0divを使用することができますプラスあなたはto_seriesを使用してSeriesオブジェクトにIndexオブジェクトを変換する必要があります。

In [121]: 
df.div(df.index.to_series(), axis=0).replace(np.inf, -1) 

Out[121]: 
      a   b   c   d 
1 0.000000 0.000000 9.000000 9.000000 
0 -1.000000 -1.000000 -1.000000 -1.000000 
3 3.000000 1.000000 1.333333 0.000000 
2 2.500000 0.000000 4.500000 2.000000 
1 7.000000 7.000000 7.000000 2.000000 
6 0.666667 0.666667 1.000000 0.666667 
1 1.000000 6.000000 0.000000 0.000000 
7 1.142857 0.000000 1.285714 0.428571 
5 0.000000 0.000000 1.600000 0.600000 
4 1.250000 0.000000 0.500000 1.000000 

さらにinfゼロ結果による除算など、あなたがそれらの行を置き換えるためにreplaceを呼び出す必要がありますwith -1

+0

これはこの例のケースでは機能しますが、ある時点でエラーが発生して失敗する可能性がある単純な除算よりも複雑な関数を使用した場合はどうなりますか?それから私は自分のデータフレームでpandas.divを呼び出すことはできません。 –

+0

これは、これが '0'除算を処理する方法を説明する必要があります – EdChum

+0

たとえば、除算を実行する代わりに、私の関数は別のデータフレームでルックアップを行い、IndexErrorsを別のものに置き換える必要がありました。 何か "def f(x、y):try:return df2.iloc [x、y]を除いてIndexError:return -1" –

0

インデックスをデータフレームに追加する方法は次のとおりです。

pd.DataFrame(df.values + df.index.values[:, None], df.index, df.columns) 
関連する問題