繁体   English   中英

Python Pandas 如何将输出保存到 csv

[英]Python Pandas How to save output to csv

你好,现在我正在做我的项目。 我想通过使用下面的算法来获取文本块的候选者。

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

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

在此处输入图片说明

这是我寻找文本块候选者的算法。 我使用 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。

输出是

在此处输入图片说明

输出意味着有 2 个候选文本块。 首先,文本块的候选从第 215 行开始,第 225 行结束(如下图)。 另一个候选文本块从第 500 行开始,第 501 行结束。

我的问题是如何将输出保存到 csv 中,不仅行数而且文本块的范围和其他列也将显示为输出?

我的预期输出就像候选文本块的屏幕截图是这样的

在此处输入图片说明

假设您的输出是字典列表:

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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM