【问题标题】:Append data from file to dataframe with Python (pandas)使用 Python (pandas) 将文件中的数据附加到数据框
【发布时间】:2015-08-14 16:43:39
【问题描述】:

我对 Python 非常是新手,但我对 PHP 和 R 有一些经验。

我编造了以下sn-p:

import os, glob, pandas as pd, numpy as np

# Create empty dataframe with correct column names
columns = ["fileName", "sentence" ]
df = pd.DataFrame(data=np.zeros((0,len(columns))), columns=columns)

# Create correct path where to fetch files
subdir = "\\testdata"
path = os.getcwd()+subdir

# Loop files in folder
for file in glob.glob(path+"\\*.lst"):
    # If file is readable 
    if os.access(file, os.R_OK):
        # Find lines inside files
        lines = [line.rstrip("\n") for line in open(file)]
        # For each line, do something
        for line in lines:
            # I need some help here
            print(os.path.basename(file)[:-4])
            print(line)

目标是循环文件,从这些文件中获取内容并将它们附加到数据框df。但是有一个问题:应该每行每个文件获取内容。这个问题是 a similar question I had for R 的 Python 替代品。

假设我只有两个文件。第一行包含三行,第二行包含两行。

adapter.WR-P-P-F.lst

/home/nobackup/SONAR/COMPACT/WR-P-P-F/WR-P-P-F0000026.data.ids.xml:  <sentence>Een aanpassingseenheid ( adapter ) , aangebracht in een behuizing voornamelijk bestaande uit in- en uitvoereenheden , een koppeleenheid , een geheugeneenheid , een besturingseenheid ( met actieve en passieve elementen en monolitische geïntegreerde schakelingen ) en een elektrische voedingseenheid . &gt;</sentence>
/home/nobackup/SONAR/COMPACT/WR-P-P-F/WR-P-P-F0000026.data.ids.xml:  <sentence>Het toestel ( adapter ) draagt zorg voor de overbrenging van gegevens , met een snelheid van 10 Mbps ( megabits per seconde ) , tussen meerdere automatische gegevensverwerkende machines in een digitaal netwerk .</sentence>
/home/nobackup/SONAR/COMPACT/WR-P-P-F/WR-P-P-F0000034.data.ids.xml:  <sentence>Overwegende dat deze sensoren niet zijn ontworpen op de installatie van een gepantserde kabel ; dat de mogelijkheid moet worden geboden dat de gepantserde kabel niet verplicht wordt gesteld voor de aansluiting tussen de sensor en de adapter , maar alleen van de adapter naar het controleapparaat ; dat het bijgevolg noodzakelijk is de verordening dienovereenkomstig te wijzigen ;</sentence>

安全气囊.WS-U-E-A.lst

/home/nobackup/SONAR/COMPACT/WR-U-E-A/WR-U-E-A0000075.data.ids.xml:  <sentence>ja voor den airbag op te pompen eh :p</sentence>
/home/nobackup/SONAR/COMPACT/WR-U-E-A/WR-U-E-A0000129.data.ids.xml:  <sentence>Dobby , als ze valt heeft ze dan wel al ne airbag hee</sentence>

我想要实现的是 Python 循环遍历每个文件,然后遍历该文件中的每个 line 并从中提取数据。例如,我想获取每一行的内容并提取&lt;sentence&gt;&lt;/sentence&gt; 中的句子并放入dfsentence 列。因此,文件的每一行都会在数据帧上获得自己的行。此外,我们还可以将正在读取的当前文件的文件名添加到列filename(参见上面的最后一行代码)。

一个重要的结果是,在上面的示例中,数据框将包含三行 filenameadapter.WR-P-P-F 和两行 airbag.WS-U-E-A 并且都使用不同的sentence

上述示例的预期输出:

fileName          | sentence
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
adapter.WR-P-P-F    Een aanpassingseenheid ( adapter ) , aangebracht in een behuizing voornamelijk bestaande uit in- en uitvoereenheden , een koppeleenheid , een geheugeneenheid , een besturingseenheid ( met actieve en passieve elementen en monolitische geïntegreerde schakelingen ) en een elektrische voedingseenheid . &gt;
adapter.WR-P-P-F    Het toestel ( adapter ) draagt zorg voor de overbrenging van gegevens , met een snelheid van 10 Mbps ( megabits per seconde ) , tussen meerdere automatische gegevensverwerkende machines in een digitaal netwerk .
adapter.WR-P-P-F    Overwegende dat deze sensoren niet zijn ontworpen op de installatie van een gepantserde kabel ; dat de mogelijkheid moet worden geboden dat de gepantserde kabel niet verplicht wordt gesteld voor de aansluiting tussen de sensor en de adapter , maar alleen van de adapter naar het controleapparaat ; dat het bijgevolg noodzakelijk is de verordening dienovereenkomstig te wijzigen ;
airbag.WS-U-E-A     ja voor den airbag op te pompen eh :p
airbag.WS-U-E-A     Dobby , als ze valt heeft ze dan wel al ne airbag hee

也许我的逻辑是错误的,但我是怎么看的:循环文件和行并立即将内容添加到df。但是,我不确定在 Python 中首先创建一个包含所有内容的新列,然后将该内容附加到数据框是否更好?

【问题讨论】:

    标签: python numpy pandas dataframe


    【解决方案1】:

    经过大量复制粘贴后,我找到了解决方案,但我不完全确定为什么会这样。

    for file in glob.glob(path+"\\*.lst"):
        # If file is readable
        if os.access(file, os.R_OK):
            # Find lines inside files
            lines = [line.rstrip("\n") for line in codecs.open(file,"r","utf-8")]
            # For each line, do something
            for line in lines:
                base = os.path.basename(file)[:-4]
                sentence = re.sub("<sentence>|</sentence>","",line)
    
                df = df.append([dict(filename=base, sentence=sentence)])
    

    如果我理解正确你所做的是,创建一个包含关键文件名和关键语句的字典条目,然后添加我们需要的值。但我不明白的是,append 如何知道如何解释条目,即它如何知道它应该将条目与已经存在的列名合并?

    【讨论】:

      猜你喜欢
      • 2018-02-22
      • 1970-01-01
      • 2020-07-11
      • 1970-01-01
      • 2021-03-15
      • 1970-01-01
      • 2019-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多