我正在尝试从.txt文件构建数据框架。 .txt文件(这是我在另一个程序中使用的参数)看起来像这样:
a('s1','0')=1;
a('s2','0')=1;
a('s2','18')=1;
a('s3','0')=1;
a('s3','19')=1;
a('s3','21')=1;
a('s4','0')=1;
a('s4','20')=1;
其中s1,s2,s3 ...是路线,因此,路线s1,路线s2,路线s3 ...适用于航班。而以下“ 0”,“ 18”,“ 19”是航班的ID。因此,基本上,路线s1只是“ 0”航班,但路线s3则是先进行“ 0”航班,然后是“ 19”航班,最后是“ 21”航班。
我要从此txt文件中提取的是一个数据框,其中包含路线(s1,s2,s ...)以及在该路线中运行的首个和最后一个航班。因此,如果s10路线有5个航班,我只想要该路线的首个和最后一个航班。
Python或熊猫中有办法吗?
答案 0 :(得分:0)
您可以尝试以下方法吗?
import pandas as pd
with open('data.txt', 'r') as infile:
data = infile.read()
df = pd.DataFrame([i[i.find("(")+1:i.find(")")].replace("'", '').split(',')
for i in data.split('\n')], columns=['route', 'flight_id'])
print(df)
输出:
route flight_id
0 s1 0
1 s2 0
2 s2 18
3 s3 0
4 s3 19
5 s4 0
6 s4 20
答案 1 :(得分:0)
对于正则表达式而言,这似乎是一项简单的任务:
import re
import pandas as pd
extract_route = re.compile(r"a\('(\w+)','(\d+)'\)=1;")
with open('data.txt', 'r') as f:
routes = f.readlines()
df = pd.DataFrame([extract_route.split(route)[1:3] for route in routes],
columns=['Route', 'FlightID'])
作为答案的补充,您现在可以按“路线”对系列进行分组:
groups = df.groupby('Route')
有了这些组后,您可以使用以下方法获得首个航班和最后一个航班:
>>> groups.first()
FlightID
Route
s1 0
s2 0
s3 0
s4 0
>>> groups.last()
FlightID
Route
s1 0
s2 18
s3 21
s4 20
>>>
这种方法的主要优点是您不会丢失中间航班信息,以防日后需要它们。