Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用.txt文件构建数据帧_Python_Pandas - Fatal编程技术网

Python 用.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”

我正在尝试用.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或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),代码能够处理任意数量的路由。你认为什么不起作用?