【问题标题】:Python Pandas How to save output to csvPython Pandas 如何将输出保存到 csv
【发布时间】:2017-01-18 13:16:33
【问题描述】:

您好,现在我正在处理我的项目。我想通过下面的算法得到文本块的候选。

我的输入是一个 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

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

输出是

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

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

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

【问题讨论】:

    标签: python csv pandas dataframe


    【解决方案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)
    

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

    【讨论】:

    • 对不起,我不明白你的意思。你能给我解释一下吗?我必须在我的代码中添加什么语法。我直接在我的程序中添加你的代码,但它不起作用
    • 你打印here的变量是什么?
    • i 在 TB.iteritems() 中为 x 打印:打印 x。输出将是 TB.UPDATE
    • 对不起,您的回答没有给我预期的输出,当我编写您的代码时,输​​出只是重复我的最新输出,即 (7, {'start': 500, 'end': 501 })
    • 我非常怀疑这一点。我的答案中的代码行返回一个数据框,而不是一个元组。你能仔细检查你正在运行的东西吗?不要忘记打印整个内容。
    猜你喜欢
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2019-08-04
    • 2019-07-02
    • 2015-08-07
    • 1970-01-01
    • 2015-12-30
    相关资源
    最近更新 更多