如何从一个带有注解的txt文件创建一个Pandas Dataframe ?

jw5wzhpr  于 2022-11-27  发布在  其他
关注(0)|答案(2)|浏览(123)

我需要创建一个基于4个txt文件的Pandas数据框架,其中包含基于以下结构的注解(阅读时跳过):

# Moteur conçu par le Poly Propulsion Lab (PPL)
nom=Tondeuse

# Propriétés générales
hauteur=0.5
masse=20.0
prix=110.00

# Propriétés du moteur
impulsion specifique=80

# Moteur conçu par le Poly Propulsion Lab (PPL)
nom=Civic VTEC

# Propriétés générales
hauteur=2.0
masse=3000.0
prix=2968.00

# Propriétés du moteur
impulsion specifique=205

# Moteur conçu par le Poly Propulsion Lab (PPL)
nom=VelociRAPTOR

# Propriétés générales
hauteur=4.0
masse=2000.0
prix=6000.00

# Propriétés du moteur
impulsion specifique=250

# Moteur conçu par le Poly Propulsion Lab (PPL)
nom=La Puissance

# Propriétés générales
hauteur=12.0
masse=15000.0
prix=39000.00

# Propriétés du moteur
impulsion specifique=295

这就是我需要的结果:

nom  hauteur    masse     prix  impulsion specifique
0      Tondeuse      0.5     20.0    110.0                    80
1    Civic VTEC      2.0   3000.0   2968.0                   205
2  VelociRAPTOR      4.0   2000.0   6000.0                   250
3  La Puissance     12.0  15000.0  39000.0                   295

我不知道这是否可能但这就是我被要求做的

6qftjkof

6qftjkof1#

欢迎来到Stackoverflow!:)
如果你的txt文件有你刚才展示的内容,你可以用panda作为CSV文件来读取它们。
pandas.read_csv函数有多个方面可以帮助您:

  • 它会输出一个 Dataframe ,这是您希望最终使用的格式
  • 具有comment输入参数,使用该参数可以定义要忽略的行
  • 您可以使用=符号作为分隔符,这将使您能够将数据拆分到所需的部分中

现在,让我们尝试使用read_csv函数读取一个文件:

import pandas as pd
df = pd.read_csv(file, comment='#', sep='=', header=None)
df
                    nom  Tondeuse                                                                                                                                                                                                                                               
0               hauteur       0.5                                                                                                                                                                                                                                               
1                 masse      20.0                                                                                                                                                                                                                                               
2                  prix     110.0                                                                                                                                                                                                                                               
3  impulsion specifique      80.0

我们还没有完全做到这一点。我们希望删除没有提供任何信息的索引列,并希望转置 Dataframe (行<->和列),以便能够将所有 Dataframe 连接在一起。让我们开始吧!

import pandas as pd
df = pd.read_csv(file, comment='#', sep='=', header=None, index_col=0).T
df

0       nom hauteur masse    prix impulsion specifique                                                                                                                                                                                                                          
1  Tondeuse     0.5  20.0  110.00                   80

这样看起来好多了!输入index_col=0使最左边的列成为索引列,最后的.T转置 Dataframe 。现在我们只需要将其放入一个循环中,并使用它生成一个完整的脚本!

import pandas as pd
import glob
import os

files = glob.glob(os.path.join(path, '*.csv'))

all_dfs = []
for file in files:
    current_df = pd.read_csv(file, comment='#', sep='=', header=None, index_col=0).T
    all_dfs.append(current_df)

total_df = pd.concat(all_dfs)
total_df

0           nom hauteur    masse      prix impulsion specifique                                                                                                                                                                                                                 
1  La Puissance    12.0  15000.0  39000.00                  295                                                                                                                                                                                                                 
1    Civic VTEC     2.0   3000.0   2968.00                  205                                                                                                                                                                                                                 
1  VelociRAPTOR     4.0   2000.0   6000.00                  250                                                                                                                                                                                                                 
1      Tondeuse     0.5     20.0    110.00                   80

请注意,您仍然有最左边的列与索引号,我没有清除它,因为我不确定您想要在那里。
另外,重要的是,您需要注意,如果文件中列的名称稍有不同(例如,impulsion specifiqueimpulsion spécifique),这将导致错误。您需要为这些创建错误处理过程。或者强制执行特定的模式,但这超出了本问题的范围。
我希望这对你有帮助!

hrysbysz

hrysbysz2#

您的数据文件看起来非常接近配置文件。您可以使用configparser从每个文件生成一个字典:

from pathlib import Path
from configparser import ConfigParser

data = []
for file in Path("data").glob("*.txt"):
    parser = ConfigParser()
    # INI file requires a section header. Yours don't have one.
    # So let's give it one called DEFAULT
    parser.read_string("[DEFAULT]\n" + file.read_text())
    data.append(dict(parser.items("DEFAULT")))

df = pd.DataFrame(data)

相关问题