2017-08-31 47 views
0

我目前正在嘗試使用多行來計算地震導航文件中的shotpoints之間的距離。我目前的代碼如下:在熊貓的兩列中使用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") 

此代碼將帶有shotpoint數據的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」] ==行[「行」]:給我下面的錯誤:類型錯誤:元組索引必須是整數,而不是str的 – BHaag

+0

注意,這將解決您報告的錯誤。 if/else語句中的代碼仍然需要一些工作。 – IanS

+0

是的,它似乎現在運行,但是,行不匹配的值沒有被替換。你知道如何將多列的行值設置爲0或n/a嗎?我在後 – BHaag