Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.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
使用dataframes从csv编写函数,以读取和返回python中的列值_Python_Python 3.x_Pandas_Dataframe - Fatal编程技术网

使用dataframes从csv编写函数,以读取和返回python中的列值

使用dataframes从csv编写函数,以读取和返回python中的列值,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,我在csv文件中设置了以下数据: vehicle---time-----aspd[m/s]------gspd[m/s]----hdg---alt[m-msl] veh_1---17:19.5---0.163471505---0.140000001---213---273.8900146 veh_2---17:19.5---0.505786836---0.170000002---214---273.9100037 veh_3---17:19.8---0.173484877---0.109999

我在csv文件中设置了以下数据:

vehicle---time-----aspd[m/s]------gspd[m/s]----hdg---alt[m-msl]

veh_1---17:19.5---0.163471505---0.140000001---213---273.8900146
veh_2---17:19.5---0.505786836---0.170000002---214---273.9100037
veh_3---17:19.8---0.173484877---0.109999999---213---273.980011
veh_4---44:12.4---18.64673424---19.22999954---316---388.9299927
veh_5---44:13.0---18.13533401---19.10000038---316---389.1700134
我正在尝试编写一个函数launch_time(),其中包含两个输入(数据帧、车辆名称),用于在gspd第一次报告超过10.0 m/s时返回。 输出时间必须从字符串(HH:MM:SS.SS)转换为12:00后的分钟格式

它应该是这样的:

>>> launch_time(df, veh_1)
30.0
'veh_1', 30.0, 'veh_2', 15.0 
我将使用此函数迭代每个车辆,然后需要将结果记录到一个元组列表中,格式为启动序列顺序(v_name,launch time)

它应该是这样的:

>>> launch_time(df, veh_1)
30.0
'veh_1', 30.0, 'veh_2', 15.0 
披露:我的python/pandas知识非常入门

您可以使用分隔符
-{3,}
-使用3和更多的
-
读取csv:

import pandas as pd
from pandas.compat import StringIO

temp=u"""vehicle---time-----aspd[m/s]------gspd[m/s]----hdg---alt[m-msl]

veh_1---17:19.5---0.163471505---0.140000001---213---273.8900146
veh_2---17:19.5---0.505786836---0.170000002---214---273.9100037
veh_3---17:19.8---0.173484877---0.109999999---213---273.980011
veh_4---44:12.4---18.64673424---19.22999954---316---388.9299927
veh_5---45:13.0---18.13533401---19.10000038---316---389.1700134"""
#after testing replace StringIO(temp) to filename
df = pd.read_csv(StringIO(temp), sep="-{3,}", engine='python')

print (df)
  vehicle     time  aspd[m/s]  gspd[m/s]  hdg  alt[m-msl]
0   veh_1  17:19.5   0.163472       0.14  213  273.890015
1   veh_2  17:19.5   0.505787       0.17  214  273.910004
2   veh_3  17:19.8   0.173485       0.11  213  273.980011
3   veh_4  44:12.4  18.646734      19.23  316  388.929993
4   veh_5  45:13.0  18.135334      19.10  316  389.170013
然后转换列
time
,过滤
10m/s
以上的所有行,对使用的车辆分组,然后获取最后一列
zip
time
,并转换为
列表

df.time = pd.to_timedelta('00:' + df.time, unit='h').\
              astype('timedelta64[m]').astype(int)
req = df[df['gspd[m/s]'] > 10].\
          sort_values('time', ascending=True).\
          groupby('vehicle', as_index=False).head(1)
print(req)
  vehicle  time  aspd[m/s]  gspd[m/s]  hdg  alt[m-msl]
4   veh_5    45  18.135334      19.10  316  389.170013
3   veh_4    44  18.646734      19.23  316  388.929993

L = list(zip(req['vehicle'],req['time']))
print (L)
[('veh_5', 45), ('veh_4', 44)]

pandas
read_csv
接受自定义分隔符,例如
'--'
。你试过了吗?文件中没有'--'。我最初使用它是为了使专栏更加清晰,但它只是增加了混乱!每辆车只能有一排还是可以有多排?在
时间
列中,有时是
小时
?样本中的格式是
MM:SS.SS
?以
分钟为单位的时间可以四舍五入吗?您缺少OP的问题。OP需要从第一行开始的时间,其中
gspd
>10m/s。将时间正确转换为
int
后,需要在
车辆上分组,在
时间上排序,然后返回第一个时间。基本上:
req=df[df['gspd[m/s]]]>10].groupby('vehicle').apply(lambda x:x.sort_values('time',升序=True)。head(1))
…谢谢,我将其添加到答案中。好的,没问题,;)我对你的评论做了一些改进,比如
df=df[df['gspd[m/s]]]>10]。对值进行排序('time',升序=True)。groupby('vehicle',as_index=False)。首先()
完成,我使用了你的改进!只是使用了
head(1)
而不是
first
,因为链接文档就是这么说的。