【问题标题】:How can I convert a pandas dataframe from a raw text in Python?如何从 Python 中的原始文本转换熊猫数据框?
【发布时间】:2026-02-16 14:40:01
【问题描述】:

我有一个包含类似数据的文本文件,格式为列表,其中第一个元素是一个字符串,其中包含由“;”分隔的列名,接下来的元素是值行:

['Timestamp;T;Pressure [bar];Input line pressure [bar];Speed [rpm];Angular Position [degree];Wheel speed [rpm];Wheel angular position [degree];',
';1;5,281;5,303;219,727;10,283;216,363;45;',
';1;5,273;5,277;219,727;11,602;216,363;45;',
';1;5,288;5,293;205,078;12,832;216,363;45;',
';1;5,316;5,297;219,727;14,15;216,363;45;',
';1;5,314;5,307;219,727;15,469;216,363;45;',
';1;5,288;5,3;219,727;16,787;216,363;45;',
';1;5,318000000000001;5,31;219,727;18,105;216,363;45;',
';1;5,304;5,3;219,727;19,424;216,388;56,25;',
';1;5,291;5,29;219,947;20,742;216,388;56,25;',
';1;5,316;5,297;219,507;22,061;216,388;56,25;']

如何将此文本列表转换为 pandas 数据框?

【问题讨论】:

    标签: python list pandas dataframe text


    【解决方案1】:

    @Nihal 解决方案的基础更短

    df = [n.split(';') for n in raw_data_text]
    df = pd.DataFrame(df[1:], columns=df[0])
    

    【讨论】:

      【解决方案2】:

      您可以使用函数from_records() 拆分输入列表中的每个字符串项并注意数据的第一行包含列标签这一事实

      >>> data = ['Timestamp;T;Pressure [bar];Input line pressure [bar];Speed \
      [rpm];Angular Position [degree];Wheel speed [rpm];Wheel angular position [degree];', \
      ';1;5,281;5,303;219,727;10,283;216,363;45;', \
      ';1;5,273;5,277;219,727;11,602;216,363;45;', \
      ';1;5,288;5,293;205,078;12,832;216,363;45;', \
      ';1;5,316;5,297;219,727;14,15;216,363;45;', \
      ';1;5,314;5,307;219,727;15,469;216,363;45;', \
      ';1;5,288;5,3;219,727;16,787;216,363;45;', \
      ';1;5,318000000000001;5,31;219,727;18,105;216,363;45;', \
      ';1;5,304;5,3;219,727;19,424;216,388;56,25;', \
      ';1;5,291;5,29;219,947;20,742;216,388;56,25;', \
      ';1;5,316;5,297;219,507;22,061;216,388;56,25;']
      
      >>> df = pd.DataFrame.from_records([r.split(';') for r in data[1:]], columns=data[0].split(';'))
      
      >>> df
        Timestamp  T     Pressure [bar] Input line pressure [bar] Speed [rpm]  \
      0            1              5,281                     5,303     219,727
      1            1              5,273                     5,277     219,727
      2            1              5,288                     5,293     205,078
      3            1              5,316                     5,297     219,727
      4            1              5,314                     5,307     219,727
      5            1              5,288                       5,3     219,727
      6            1  5,318000000000001                      5,31     219,727
      7            1              5,304                       5,3     219,727
      8            1              5,291                      5,29     219,947
      9            1              5,316                     5,297     219,507
      
       ... 
      

      【讨论】:

        【解决方案3】:

        使用pd.read_csv,从文本文件中读取数据帧,使用pd.compat.StringIO,从文本中生成流,例如io.StingIO

        pd.read_csv(pd.compat.StringIO("\n".join(lines)), sep=";")
        

        【讨论】:

        • 我更喜欢这个解决方案而不是上面的那个,因为它将肮脏的工作委托给 pandas。当没有太多数据时使用它(i/o 总是一个瓶颈)。
        • 仅适用于熊猫 *.com/questions/57104639/…
        【解决方案4】:

        代码:

        df = [
            'Timestamp;T;Pressure [bar];Input line pressure [bar];Speed [rpm];Angular Position [degree];Wheel speed [rpm];Wheel angular position [degree];',
            ';1;5,281;5,303;219,727;10,283;216,363;45;',
            ';1;5,273;5,277;219,727;11,602;216,363;45;',
            ';1;5,288;5,293;205,078;12,832;216,363;45;',
            ';1;5,316;5,297;219,727;14,15;216,363;45;',
            ';1;5,314;5,307;219,727;15,469;216,363;45;',
            ';1;5,288;5,3;219,727;16,787;216,363;45;',
            ';1;5,318000000000001;5,31;219,727;18,105;216,363;45;',
            ';1;5,304;5,3;219,727;19,424;216,388;56,25;',
            ';1;5,291;5,29;219,947;20,742;216,388;56,25;',
            ';1;5,316;5,297;219,507;22,061;216,388;56,25;']
        
        mat = [n.split(';') for n in df]
        print(mat)
        newdf1 = pd.DataFrame(mat)
        newdf1.columns = newdf1.iloc[0]
        newdf1 = newdf1.reindex(newdf1.index.drop(0))
        # newdf2 = pd.DataFrame.from_dict(df)
        print(newdf1)
        

        输出:

        0  Timestamp  T     Pressure [bar] Input line pressure [bar] Speed [rpm]  \
        1             1              5,281                     5,303     219,727   
        2             1              5,273                     5,277     219,727   
        3             1              5,288                     5,293     205,078   
        4             1              5,316                     5,297     219,727   
        5             1              5,314                     5,307     219,727   
        6             1              5,288                       5,3     219,727   
        7             1  5,318000000000001                      5,31     219,727   
        8             1              5,304                       5,3     219,727   
        9             1              5,291                      5,29     219,947   
        10            1              5,316                     5,297     219,507   
        
        0  Angular Position [degree] Wheel speed [rpm]  \
        1                     10,283           216,363   
        2                     11,602           216,363   
        3                     12,832           216,363   
        4                      14,15           216,363   
        5                     15,469           216,363   
        6                     16,787           216,363   
        7                     18,105           216,363   
        8                     19,424           216,388   
        9                     20,742           216,388   
        10                    22,061           216,388   
        
        0  Wheel angular position [degree]    
        1                               45    
        2                               45    
        3                               45    
        4                               45    
        5                               45    
        6                               45    
        7                               45    
        8                            56,25    
        9                            56,25    
        10                           56,25 
        

        【讨论】:

        • 完美!我怎样才能把第一行作为标题?