2017-01-18 84 views
-1

你好,現在我正在處理我的項目。我想通過使用下面的算法得到文本塊的候選人。Python Pandas如何將輸出保存到csv

我的輸入是包含一個CSV文件:

  1. HTML列:行中的HTML代碼
  2. TAG柱:HTML代碼在一條線上的標籤
  3. 詞:內文在艾琳標籤
  4. TC:錨定字在一個線
  5. TG數:標籤的在數字的一條線
  6. LTC數線
  7. ,P:標籤數p和Br中的線
  8. CTTD:TC +(0.2 * LTC)+ TG - P
  9. CTTDs:平滑CTTD

enter image description here

這是我找到文本塊的候選人的算法。我使用pandas將csv文件製作成數據框。我正在使用CTTDs,TC和TG列找到候選人。

from ListSmoothing import get_filepaths_smoothing 
import pandas as pd 
import numpy as np 
import csv 

filenames = get_filepaths_smoothing(r"C:\Users\kimhyesung\PycharmProjects\newsextraction\smoothing") 
index = 0 
for f in filenames: 
    file_html=open(str(f),"r") 
    df = pd.read_csv(file_html) 
#df = pd.read_csv('smoothing/Smoothing001.csv') 

    news = np.array(df['CTTDs']) 
    new = np.array(df['TG']) 

    minval = np.min(news[np.nonzero(news)]) 
    maxval = np.max(news[np.nonzero(news)]) 

    j = 0.2 
    thetaCTTD = minval + j * (maxval-minval) 
#maxGap = np.max(new[np.nonzero(new)]) 
#minGap = np.min(new[np.nonzero(new)]) 
    thetaGap = np.min(new[np.nonzero(new)]) 
    #print thetaCTTD 
    #print maxval 
    #print minval 
    #print thetaGap 
    def create_candidates(df, thetaCTTD, thetaGAP): 
     k = 0 
     TB = {} 
     TC = 0 
     for index in range(0, len(df) - 1): 
      start = index 
      if df.ix[index]['CTTDs'] > thetaCTTD: 
       start = index 
       gap = 0 
       TC = df.ix[index]['TC'] 
       for index in range(index + 1, len(df) - 1): 
        if df.ix[index]['TG'] == 0: 
         continue 
        elif df.ix[index]['CTTDs'] <= thetaCTTD and gap >= thetaGAP: 
         break 
        elif df.ix[index]['CTTDs'] <= thetaCTTD: 
         gap += 1 
        TC += df.ix[index]['TC'] 
      if (TC < 1) or (start == index): 
       continue 
      TB.update({ 
       k: { 
        'start': start, 
        'end': index - 1 
       } 
      }) 
      k += 1 
     return TB 

    def get_unique_candidate(TB): 
     TB = tb.copy() 
     for key, value in tb.iteritems(): 
      if key == len(tb) - 1: 
       break 
      if value['end'] == tb[key+1]['end']: 
       del TB[key+1] 
      elif value['start'] < tb[key+1]['start'] < value['end']: 
       TB[key]['end'] = tb[key+1]['start'] - 1 
      else: 
       continue 
     return TB 

    index += 1 
    stored_file = "textcandidate/textcandidate" + '{0:03}'.format(index) + ".csv" 
    tb = create_candidates(df, thetaCTTD, thetaGap) 
    TB = get_unique_candidate(tb) 
    filewrite = open(stored_file, "wb") 
    df_list = [] 
    for (k, d) in TB.iteritems(): 
     candidate_df = df.loc[d['start']:d['end']] 
     candidate_df['candidate'] = k 
     df_list.append(candidate_df) 
    output_df = pd.concat(df_list) 
    output_df.to_csv(stored_file) 

    writer = csv.writer(filewrite, lineterminator='\n') 
    filewrite.close 

ThetaCTTD是10.36和thethaGap是1

輸出是

enter image description here

輸出裝置有文本塊的2個候選。首先,文本塊的準備從行號215開始,並結束行號225(如圖中的波紋管)。而另一個候選的文本塊從行號500開始,結束行號501開始。

我的問題是如何將輸出保存到csv中,而不僅僅是行數,而是文本塊和其他列的範圍也會顯示爲輸出?

我的預期輸出是一樣候選文本塊的截圖就是這樣一個

enter image description here

回答

1

假設你的輸出是一個字典列表:

pd.concat([df.loc[d['start']:d['end']] for (k, d) in TB.iteritems()]) 

需要注意的是,我們通過標籤片,因此將包含d['end']


編輯:在添加新的一列候選號碼。

它的清潔編寫一個循環,而不是做兩個CONCAT操作:

df_list = [] 
for (k, d) in TB.iteritems(): 
    candidate_df = df.loc[d['start']:d['end']] 
    candidate_df['candidate'] = k 
    df_list.append(candidate_df) 

output_df = pd.concat(df_list) 

它也更快一次來連接所有dataframes底。

+0

即時對不起,我不明白你的意思。你能向我解釋一下嗎?我的代碼中必須添加什麼語法。我直接在你的程序中添加你的代碼,但它不起作用 –

+0

你打印的變量是什麼[這裏](https://i.stack.imgur.com/ZzlDy.jpg)? – IanS

+0

我在TB.iteritems()中打印x:print x。並輸出將TB.UPDATE –

相關問題