Python 用.txt文件构建数据帧
我正在尝试用.txt文件构建一个数据帧。.txt文件(我在另一个程序中使用的参数)如下所示:Python 用.txt文件构建数据帧,python,pandas,Python,Pandas,我正在尝试用.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”
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或pandas中有什么方法吗?您可以尝试以下方法:
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
对于正则表达式来说,这似乎是一项简单的任务:
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
>>>
这种方法的主要优点是不会丢失中间航班信息,以备将来需要。能否分享您的txt文件的外观?它是发布的“该文件的外观”因为这显然是一种自定义格式,您必须先为其编写自定义解析器。“我想从这个txt文件中提取的是一个数据帧,其中包含航线(s1、s2、s…)以及在该航线上运行的第一次和最后一次航班。“对于
s1
,没有最后一个操作员,在这种情况下,您希望得到什么?在这种情况下,第一个航班和最后一个航班是相同的。所以从s1开始,航班“0”是第一个也是最后一个。谢谢你的评论!感谢Jeril的快速响应,当一条航线有2个以上航班时,它不起作用。可能是我的错,因为我发布的.txt示例只是两个航班的航线。让我来编辑它。你能分享一个有多个航班的样本吗?我无法找到样本('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;感谢accdias的响应,它得到以下错误:AssertionError:2列已传递,传递的数据有1列我的错误。我忘记了findall()
返回一个元组。我将修正我的示例。当一条航线有两个以上航班时,它不起作用。可能是我的错,因为在我发布的.txt示例中,只有两个航班的航线。让我编辑一下(参见s3),代码能够处理任意数量的路由。你认为什么不起作用?