Использование панд, вы можете сделать следующее:
import pandas as pd
df = pd.read_table('data', sep='\n', header=None, names=['town'])
df['is_state'] = df['town'].str.contains(r'\[edit\]')
df['groupno'] = df['is_state'].cumsum()
df['index'] = df.groupby('groupno').cumcount()
df['state'] = df.groupby('groupno')['town'].transform('first')
df['state'] = df['state'].str.replace(r'\[edit\]', '')
df['town'] = df['town'].str.replace(r' \(.+$', '')
df = df.loc[~df['is_state']]
df = df[['state','town']]
, который дает
state town
1 Alabama Auburn
2 Alabama Florence
3 Alabama Jacksonville
5 Alaska Fairbanks
7 Arizona Flagstaff
8 Arizona Tempe
9 Arizona Tucson
Вот расстройство того, что делает код. После загрузки текстового файла в DataFrame используйте str.contains
, чтобы идентифицировать строки, которые являются состояниями. Используйте cumsum
взять накопленную сумму True/False значения, где правда трактуются как 1 и Ложной как 0.
df = pd.read_table('data', sep='\n', header=None, names=['town'])
df['is_state'] = df['town'].str.contains(r'\[edit\]')
df['groupno'] = df['is_state'].cumsum()
# town is_state groupno
# 0 Alabama[edit] True 1
# 1 Auburn (Auburn University)[1] False 1
# 2 Florence (University of North Alabama) False 1
# 3 Jacksonville (Jacksonville State University)[2] False 1
# 4 Alaska[edit] True 2
# 5 Fairbanks (University of Alaska Fairbanks)[2] False 2
# 6 Arizona[edit] True 3
# 7 Flagstaff (Northern Arizona University)[6] False 3
# 8 Tempe (Arizona State University) False 3
# 9 Tucson (University of Arizona) False 3
Теперь для каждого groupno
числа, мы можем присвоить уникальное число для каждой строки в группе :
df['index'] = df.groupby('groupno').cumcount()
# town is_state groupno index
# 0 Alabama[edit] True 1 0
# 1 Auburn (Auburn University)[1] False 1 1
# 2 Florence (University of North Alabama) False 1 2
# 3 Jacksonville (Jacksonville State University)[2] False 1 3
# 4 Alaska[edit] True 2 0
# 5 Fairbanks (University of Alaska Fairbanks)[2] False 2 1
# 6 Arizona[edit] True 3 0
# 7 Flagstaff (Northern Arizona University)[6] False 3 1
# 8 Tempe (Arizona State University) False 3 2
# 9 Tucson (University of Arizona) False 3 3
Снова для каждого groupno
числа, мы можем найти состояние, выбрав первый город в каждой группе:
df['state'] = df.groupby('groupno')['town'].transform('first')
# town is_state groupno index state
# 0 Alabama[edit] True 1 0 Alabama[edit]
# 1 Auburn (Auburn University)[1] False 1 1 Alabama[edit]
# 2 Florence (University of North Alabama) False 1 2 Alabama[edit]
# 3 Jacksonville (Jacksonville State University)[2] False 1 3 Alabama[edit]
# 4 Alaska[edit] True 2 0 Alaska[edit]
# 5 Fairbanks (University of Alaska Fairbanks)[2] False 2 1 Alaska[edit]
# 6 Arizona[edit] True 3 0 Arizona[edit]
# 7 Flagstaff (Northern Arizona University)[6] False 3 1 Arizona[edit]
# 8 Tempe (Arizona State University) False 3 2 Arizona[edit]
# 9 Tucson (University of Arizona) False 3 3 Arizona[edit]
мы в основном час ave желаемый DataFrame; все, что осталось, - это префикс результата. Мы можем удалить [edit]
из state
с и все после первой скобки от town
с помощью str.replace
:
df['state'] = df['state'].str.replace(r'\[edit\]', '')
df['town'] = df['town'].str.replace(r' \(.+$', '')
Удалите строки, где town
фактически состояние:
df = df.loc[~df['is_state']]
И, наконец, , сохраните только нужные столбцы:
df = df[['state','town']]
спасибо, работает отлично. только 'city, rest = line.split ('', 1) 'не работает для чего-то вроде Нью-Йорка, но его легко исправить – lucarlig
возможно' split ("(") 'должен работать. – furas
да я уже исправил его – lucarlig