Python Pandas如何将输出保存到csv

时间:2017-01-18 13:16:33

标签: python csv pandas dataframe

您好我正在处理我的项目。我希望通过下面的算法获得文本块的候选者。

我的输入是一个csv文档,其中包含:

  1. HTML列:行中的html代码
  2. TAG列:行中的html代码标记
  3. 单词:aline
  4. 中标签内的文字
  5. TC:一行中的字数
  6. LTC:一行中的锚字数
  7. TG:一行中的标记数
  8. P:行中的标签p和br的数量
  9. CTTD:TC +(0.2 * LTC)+ TG-P
  10. CTTDs:平滑的CTTD
  11. enter image description here

    这是我找到文本块候选的算法。我使用pandas将csv文件转换为数据帧。我正在使用CTTD,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 个答案:

答案 0 :(得分: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)

最后一次连接所有数据帧也更快。