2017-08-31 1 views
0

現在、複数の行を含む地震探査ファイルのショットポイント間の距離を計算しようとしています。現在のコードは次のとおりです。パンダの2列にわたるif文を使用

def Delimiter(Filename, a, b, c, d, e, f): 
    data = pd.read_fwf(Filename, names=[a, b ,c ,d ,e ,f ], header=None) 
    data['lineshift'] = data['line'].shift(-1) 
    data['bool'] = data['lineshift'] == data['line'] 
    for _, row in data.iterrows(): 
     data['SPDIF'] = np.abs(data['sp'].astype(float) - data['sp'].astype(float).shift(-1)) 
     data['XDIFF'] = data['X'] - data['X'].shift(-1) 
     data['YDIFF'] = data['Y'] - data['Y'].shift(-1) 
     data['XYDIFF'] = np.sqrt(data['XDIFF']**2 + data['YDIFF']**2) 
     data['SPDIST'] = data['XYDIFF']/data['SPDIF'] 
     if row['line'] != row['lineshift']: 

      data['SPDIF'] = data['SPDIF'].replace({0: np.nan}) 
      data['XDIFF'] = data['XDIFF'].replace({0: np.nan}) 
      data['YDIFF'] = data['YDIFF'].replace({0: np.nan}) 
      data['XYDIFF'] = data['XYDIFF'].replace({0: np.nan}) 
      data['SPDIST'] = data['SPDIST'].replace({0: np.nan}) 
    data.info() 
    print data 

Delimiter(os.path.splitext(x)[0] + ".csv", "line", "sp", "Xcoord", "Ycoord", "X", "Y") 

このコードは、ショットポイントデータを含むCSVをパンダデータフレームに読み込みます。しかし、コードが異なる行の2つのショットポイントの間の距離を計算していないかどうかをチェックしたいと思います。 'line'列が同じ行の 'lineshift'列と異なる場合は、N/Aを表示します。同じ場合は、その特定の行に対して5つの新しい列を計算する必要があります。可能であれば

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

、私はこのコードの実行を作成し、すべての行をチェックするために追加して何が必要でしょう:私はこのコードを実行すると

はしかし、それは次のエラーを与えますか?

CSVファイルのデータの例:

 line sp ycoord  xcoord x  y   lineshift 
8  761298 1080 521754.1N 65132.6E 255355 479838  761298 True 
9  761298 1090 5218 2.5N 65154.3E 255760 480107  761298 True 
10 761298 1100 521812.1N 65216.0E 256165 480410  761298 True 
11 761298 1110 521820.7N 65236.8E 256554 480685  771022 False 
12 771022 1020 521835.8N 65238.3E 256573 481153  771022 True 
13 771022 1030 521841.0N 65245.2E 256700 481315  771022 True 
14 771022 1040 521845.8N 65252.2E 256830 481466  771022 True 

答えて

0

これ:data['lineshift'] == data['line']は直列ではなくブールので、if data['lineshift'] == data['line']は曖昧です。

for _, row in data.iterrows(): 
     if row['lineshift'] == row['line']: 
      # ... 

編集

私は、あなたがループ内で現在の行をテストするためのもののようなものを考えて、これはあなたが報告されたエラーを修正しますが、ここでループを使用しないでください。行あれば使用して

def Delimiter(Filename, a, b, c, d, e, f): 
    data = pd.read_fwf(Filename, names=[a, b ,c ,d ,e ,f ], header=None) 
    data['lineshift'] = data['line'].shift(-1) 
    data['bool'] = data['lineshift'] == data['line'] 
    # calculate this only once 
    data['SPDIF'] = np.abs(data['sp'].astype(float) - data['sp'].astype(float).shift(-1)) 
    data['XDIFF'] = data['X'] - data['X'].shift(-1) 
    data['YDIFF'] = data['Y'] - data['Y'].shift(-1) 
    data['XYDIFF'] = np.sqrt(data['XDIFF']**2 + data['YDIFF']**2) 
    data['SPDIST'] = data['XYDIFF']/data['SPDIF'] 

    data.loc[~data['bool'], ['SPDIF', 'XDIFF', 'YDIFF', 'XYDIFF', 'SPDIST']] = np.nan 

    data.info() 
    print data 
+0

[「lineshift」] ==行[「行は」]:私は次のエラーを与える:TypeError例外を:タプルインデックスは、これはあなたが報告されたエラーを修正すること – BHaag

+0

注意をstrない、整数でなければなりません。 if/elseステートメント内のコードにはまだまだいくつかの作業が必要です。 – IanS

+0

ええ、今実行されているようですが、行が一致しない値のどれも置き換えられません。複数の列の行の値を0またはn/aに設定する方法を知っていますか?私の現在のコードをポスト – BHaag

関連する問題