代码之家  ›  专栏  ›  技术社区  ›  Peter Wilson

从具有特定模式的txt文件创建Pandas数据帧

  •  18
  • Peter Wilson  · 技术社区  · 9 年前

    我需要基于以下结构的文本文件创建Pandas数据框架:

    Alabama[edit]
    Auburn (Auburn University)[1]
    Florence (University of North Alabama)
    Jacksonville (Jacksonville State University)[2]
    Livingston (University of West Alabama)[2]
    Montevallo (University of Montevallo)[2]
    Troy (Troy University)[2]
    Tuscaloosa (University of Alabama, Stillman College, Shelton State)[3][4]
    Tuskegee (Tuskegee University)[5]
    Alaska[edit]
    Fairbanks (University of Alaska Fairbanks)[2]
    Arizona[edit]
    Flagstaff (Northern Arizona University)[6]
    Tempe (Arizona State University)
    Tucson (University of Arizona)
    Arkansas[edit]
    

    带“[edit]”的行是状态,而带[number]的行是区域。我需要拆分以下内容,然后为每个区域名称重复州名称。

    Index          State          Region Name
    0              Alabama        Aurburn...
    1              Alabama        Florence...
    2              Alabama        Jacksonville...
    ...
    9              Alaska         Fairbanks...
    10             Alaska         Arizona...
    11             Alaska         Flagstaff...
    

    熊猫数据帧

    我不知道如何将基于“[edit]”和“[number]”或“(字符)”的文本文件拆分为相应的列,并为每个区域名称重复状态名称。请任何人给我一个起点,开始完成以下工作。

    6 回复  |  直到 9 年前
        1
  •  20
  •   jezrael    9 年前

    你可以先 read_csv 带参数 name 创造 DataFrame 带柱 Region Name ,分隔符是不在值中的值(如 ; ):

    df = pd.read_csv('filename.txt', sep=";", names=['Region Name'])
    

    然后 insert 新专栏 State 具有 extract 文本所在的行 [edit] 和 replace 所有值来自 ( 到列的末尾 地区名称 .

    df.insert(0, 'State', df['Region Name'].str.extract('(.*)\[edit\]', expand=False).ffill())
    df['Region Name'] = df['Region Name'].str.replace(r' \(.+$', '')
    

    最后,删除文本所在的行 [编辑] 通过 boolean indexing ,掩码由创建 str.contains :

    df = df[~df['Region Name'].str.contains('\[edit\]')].reset_index(drop=True)
    print (df)
          State   Region Name
    0   Alabama        Auburn
    1   Alabama      Florence
    2   Alabama  Jacksonville
    3   Alabama    Livingston
    4   Alabama    Montevallo
    5   Alabama          Troy
    6   Alabama    Tuscaloosa
    7   Alabama      Tuskegee
    8    Alaska     Fairbanks
    9   Arizona     Flagstaff
    10  Arizona         Tempe
    11  Arizona        Tucson
    

    如果需要所有值,解决方案更容易:

    df = pd.read_csv('filename.txt', sep=";", names=['Region Name'])
    df.insert(0, 'State', df['Region Name'].str.extract('(.*)\[edit\]', expand=False).ffill())
    df = df[~df['Region Name'].str.contains('\[edit\]')].reset_index(drop=True)
    print (df)
          State                                        Region Name
    0   Alabama                      Auburn (Auburn University)[1]
    1   Alabama             Florence (University of North Alabama)
    2   Alabama    Jacksonville (Jacksonville State University)[2]
    3   Alabama         Livingston (University of West Alabama)[2]
    4   Alabama           Montevallo (University of Montevallo)[2]
    5   Alabama                          Troy (Troy University)[2]
    6   Alabama  Tuscaloosa (University of Alabama, Stillman Co...
    7   Alabama                  Tuskegee (Tuskegee University)[5]
    8    Alaska      Fairbanks (University of Alaska Fairbanks)[2]
    9   Arizona         Flagstaff (Northern Arizona University)[6]
    10  Arizona                   Tempe (Arizona State University)
    11  Arizona                     Tucson (University of Arizona)
    
        2
  •  8
  •   ultra909    9 年前

    您可以先将文件解析为元组:

    import pandas as pd
    from collections import namedtuple
    
    Item = namedtuple('Item', 'state area')
    items = []
    
    with open('unis.txt') as f: 
        for line in f:
            l = line.rstrip('\n') 
            if l.endswith('[edit]'):
                state = l.rstrip('[edit]')
            else:            
                i = l.index(' (')
                area = l[:i]
                items.append(Item(state, area))
    
    df = pd.DataFrame.from_records(items, columns=['State', 'Area'])
    
    print df
    

    输出:

          State          Area
    0   Alabama        Auburn
    1   Alabama      Florence
    2   Alabama  Jacksonville
    3   Alabama    Livingston
    4   Alabama    Montevallo
    5   Alabama          Troy
    6   Alabama    Tuscaloosa
    7   Alabama      Tuskegee
    8    Alaska     Fairbanks
    9   Arizona     Flagstaff
    10  Arizona         Tempe
    11  Arizona        Tucson
    
        3
  •  5
  •   MaxU - stand with Ukraine    9 年前

    假设您有以下DF:

    In [73]: df
    Out[73]:
                                                     text
    0                                       Alabama[edit]
    1                       Auburn (Auburn University)[1]
    2              Florence (University of North Alabama)
    3     Jacksonville (Jacksonville State University)[2]
    4          Livingston (University of West Alabama)[2]
    5            Montevallo (University of Montevallo)[2]
    6                           Troy (Troy University)[2]
    7   Tuscaloosa (University of Alabama, Stillman Co...
    8                   Tuskegee (Tuskegee University)[5]
    9                                        Alaska[edit]
    10      Fairbanks (University of Alaska Fairbanks)[2]
    11                                      Arizona[edit]
    12         Flagstaff (Northern Arizona University)[6]
    13                   Tempe (Arizona State University)
    14                     Tucson (University of Arizona)
    15                                     Arkansas[edit]
    

    你可以使用 Series.str.extract() 方法:

    In [117]: df['State'] = df.loc[df.text.str.contains('[edit]', regex=False), 'text'].str.extract(r'(.*?)\[edit\]', expand=False)
    
    In [118]: df['Region Name'] = df.loc[df.State.isnull(), 'text'].str.extract(r'(.*?)\s*[\(\[]+.*[\n]*', expand=False)
    
    In [120]: df.State = df.State.ffill()
    
    In [121]: df
    Out[121]:
                                                     text     State   Region Name
    0                                       Alabama[edit]   Alabama           NaN
    1                       Auburn (Auburn University)[1]   Alabama        Auburn
    2              Florence (University of North Alabama)   Alabama      Florence
    3     Jacksonville (Jacksonville State University)[2]   Alabama  Jacksonville
    4          Livingston (University of West Alabama)[2]   Alabama    Livingston
    5            Montevallo (University of Montevallo)[2]   Alabama    Montevallo
    6                           Troy (Troy University)[2]   Alabama          Troy
    7   Tuscaloosa (University of Alabama, Stillman Co...   Alabama    Tuscaloosa
    8                   Tuskegee (Tuskegee University)[5]   Alabama      Tuskegee
    9                                        Alaska[edit]    Alaska           NaN
    10      Fairbanks (University of Alaska Fairbanks)[2]    Alaska     Fairbanks
    11                                      Arizona[edit]   Arizona           NaN
    12         Flagstaff (Northern Arizona University)[6]   Arizona     Flagstaff
    13                   Tempe (Arizona State University)   Arizona         Tempe
    14                     Tucson (University of Arizona)   Arizona        Tucson
    15                                     Arkansas[edit]  Arkansas           NaN
    
    In [122]: df = df.dropna()
    
    In [123]: df
    Out[123]:
                                                     text    State   Region Name
    1                       Auburn (Auburn University)[1]  Alabama        Auburn
    2              Florence (University of North Alabama)  Alabama      Florence
    3     Jacksonville (Jacksonville State University)[2]  Alabama  Jacksonville
    4          Livingston (University of West Alabama)[2]  Alabama    Livingston
    5            Montevallo (University of Montevallo)[2]  Alabama    Montevallo
    6                           Troy (Troy University)[2]  Alabama          Troy
    7   Tuscaloosa (University of Alabama, Stillman Co...  Alabama    Tuscaloosa
    8                   Tuskegee (Tuskegee University)[5]  Alabama      Tuskegee
    10      Fairbanks (University of Alaska Fairbanks)[2]   Alaska     Fairbanks
    12         Flagstaff (Northern Arizona University)[6]  Arizona     Flagstaff
    13                   Tempe (Arizona State University)  Arizona         Tempe
    14                     Tucson (University of Arizona)  Arizona        Tucson
    
        4
  •  3
  •   piRSquared    9 年前

    TL;博士
    s.groupby(s.str.extract('(?P<State>.*?)\[edit\]', expand=False).ffill()).apply(pd.Series.tail, n=-1).reset_index(name='Region_Name').iloc[:, [0, 2]]


    regex = '(?P<State>.*?)\[edit\]'  # pattern to match
    print(s.groupby(
        # will get nulls where we don't have "[edit]"
        # forward fill fills in the most recent line
        # where we did have an "[edit]"
        s.str.extract(regex, expand=False).ffill()  
    ).apply(
        # I still have all the original values
        # If I group by the forward filled rows
        # I'll want to drop the first one within each group
        pd.Series.tail, n=-1
    ).reset_index(
        # munge the dataframe to get columns sorted
        name='Region_Name'
    )[['State', 'Region_Name']])
    
          State                                        Region_Name
    0   Alabama                      Auburn (Auburn University)[1]
    1   Alabama             Florence (University of North Alabama)
    2   Alabama    Jacksonville (Jacksonville State University)[2]
    3   Alabama         Livingston (University of West Alabama)[2]
    4   Alabama           Montevallo (University of Montevallo)[2]
    5   Alabama                          Troy (Troy University)[2]
    6   Alabama  Tuscaloosa (University of Alabama, Stillman Co...
    7   Alabama                  Tuskegee (Tuskegee University)[5]
    8    Alaska      Fairbanks (University of Alaska Fairbanks)[2]
    9   Arizona         Flagstaff (Northern Arizona University)[6]
    10  Arizona                   Tempe (Arizona State University)
    11  Arizona                     Tucson (University of Arizona)
    

    设置

    txt = """Alabama[edit]
    Auburn (Auburn University)[1]
    Florence (University of North Alabama)
    Jacksonville (Jacksonville State University)[2]
    Livingston (University of West Alabama)[2]
    Montevallo (University of Montevallo)[2]
    Troy (Troy University)[2]
    Tuscaloosa (University of Alabama, Stillman College, Shelton State)[3][4]
    Tuskegee (Tuskegee University)[5]
    Alaska[edit]
    Fairbanks (University of Alaska Fairbanks)[2]
    Arizona[edit]
    Flagstaff (Northern Arizona University)[6]
    Tempe (Arizona State University)
    Tucson (University of Arizona)
    Arkansas[edit]"""
    
    s = pd.read_csv(StringIO(txt), sep='|', header=None, squeeze=True)
    
        5
  •  1
  •   Brian Leach    9 年前

    在将文件放入数据帧之前,您可能需要对文件执行一些额外的操作。

    起点是将文件拆分为行,搜索字符串 [edit] 在每一行中,当字符串名称存在时,将其作为字典的键。。。

    我认为Pandas没有任何内置方法可以处理这种格式的文件。

        6
  •  0
  •   Vritika Malhotra    6 年前

    你似乎来自Coursera的数据科学入门课程。通过了这个解决方案的测试。我建议不要复制整个解决方案,而只是将其用于参考目的:)

    lines = open('university_towns.txt').readlines()
    
    l=[]
    lofl=[]
    flag=False
    for line in lines:
        l = []
        if('[edit]' in line):
            index = line[:-7]
        elif('(' in line):
            pos = line.find('(')
            line = line[:pos-1]
            l.append(index)
            l.append(line)
            flag=True
        else:
            line = line[:-1]
            l.append(index)
            l.append(line)
            flag=True
        if(flag and np.array(l).size!=0):
            lofl.append(l)
    df = pd.DataFrame(lofl,columns=["State","RegionName"])