Python для цикла с if / else и функцией добавления - PullRequest
0 голосов
/ 28 октября 2018

На основе списка, как показано ниже, мне нужно создать DataFrame со столбцами «state» и «region»:

Исходные данные:

 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)

(Данные ссылка здесь.)

Желаемый вывод:

State   Region
Alabama Auburn
Alabama Florence
Alabama Jacksonville
Alabama Livingston
Alabama Montevallo
Alabama Troy
Alabama Tuscaloosa
Alabama Tuskegee
Alaska  Fairbanks
Arizona Flagstaff
Arizona Tempe

код:

    df = pd.DataFrame(columns=['State', 'RegionName'])
    with open('university_towns.txt', 'r') as UniversityList:
            content = UniversityList.readlines()
            state_row = []
            region_row = []
            for row in content:
                if '[edit]' in row:
                    state_row.append(row)
                    region_row.append('region_to_be_repeated')
                else:
                    region_row.append(row)
                    state_row.append('state_to_be_repeated')

Как заменить 'state_to_be_reapeted' на контент, добавляемый в случае, если«если» было Истиной?

Ответы [ 3 ]

0 голосов
/ 28 октября 2018

Пример очистки этого набора данных можно найти в учебном пособии Чистка данных Pythonic с помощью NumPy и Pandas .

Вариант 1: выполнять обработку строк в "Pure Python"

Вы можете использовать жадный цикл for над строками файла и загрузить его за O (n) раз:

import pandas as pd

university_towns = []

with open('input/university_towns.txt') as file:
    for line in file:
        edit_pos = line.find('[edit]')
        if edit_pos != -1:
            # Remember this `state` until the next is found
            state = line[:edit_pos]
        else:
            # Otherwise, we have a city; keep `state` as last-seen
            parens = line.find(' (')
            town = line[:parens] if parens != -1 else line
            university_towns.append((state, town))

towns_df = pd.DataFrame(university_towns,
                        columns=['State', 'RegionName'])

Вариант 2: выполнять обработку строк через Pandas API

В качестве альтернативы, вы можете выполнять обработку строк с помощью средства доступа .str Pandas:

import re

import pandas as pd

university_towns = []

with open('input/university_towns.txt') as file:
    for line in file:
        if '[edit]' in line:
            # Remember this `state` until the next is found
            state = line
        else:
            # Otherwise, we have a city; keep `state` as last-seen
            university_towns.append((state, line))

towns_df = pd.DataFrame(university_towns,
                        columns=['State', 'RegionName'])

towns_df['State'] = towns_df.State.str.replace(r'\[edit\]\n', '')
towns_df['RegionName'] = towns_df.RegionName\
    .str.strip()\
    .str.replace(r' \(.*', '')\
    .str.replace(r'\[.*', '')

Выход:

>>> towns_df.head()
     State    RegionName
0  Alabama        Auburn
1  Alabama      Florence
2  Alabama  Jacksonville
3  Alabama    Livingston
4  Alabama    Montevallo
0 голосов
/ 28 октября 2018

Самая короткая версия, о которой я мог подумать:

import pandas as pd

lst = list()

with open('university_towns.txt', 'r', newline='\n') as infile:
    for line in infile.readlines():
        if '[edit]' in line:
            state = line.split('[')[0]
        else:
            lst.append([state, line.split(' ')[0]])

df = pd.DataFrame(lst, columns=['State', 'RegionName'])
print(df)

Производит на моей машине (Python 3.6):

      State    RegionName
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
0 голосов
/ 28 октября 2018

Если я правильно понимаю ваш вопрос и желаемый результат, вы можете сделать что-то вроде этого:

univeristylist = []
with open('university_towns.txt', 'r') as file:
    for line in file:
        if '[edit]' in line:
            state = row
        else:
            universitylist.append([state, row])

df = pd.DataFrame(universitylist, columns=['State', 'RegionName'])

Если вам не нужны детали '[edit]' и '[1]' и т. Д., Вы можете изменить код на:

univeristylist = []
with open('university_towns.txt', 'r') as file:
    for line in file:
        if '[edit]' in line:
            state = row.split(' [')[0]
        else:
            universitylist.append([state, row.split(' [')[0]])

df = pd.DataFrame(columns=['State', 'RegionName'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...