当前位置: 首页 > 知识库问答 >
问题:

获取数据帧第一行的正确方法是什么?

松嘉颖
2023-03-14

test.csv中的数据如下:

device_id,upload_time,latitude,longitude,mileage,other_vals,speed,upload_time_add_8hour,upload_time_year_month,car_id,car_type,car_num,marketer_name
1101,2020-09-30 16:03:41+00:00,46.7242,131.140233,0,,0,2020/10/1 0:03:41,202010,18,1,,
1101,2020-09-30 16:08:41+00:00,46.7242,131.140233,0,,0,2020/10/1 0:08:41,202010,18,1,,
1101,2020-09-30 16:13:41+00:00,46.7242,131.140233,0,,0,2020/10/1 0:13:41,202010,18,1,,
1101,2020-09-30 16:18:41+00:00,46.7242,131.140233,0,,0,2020/10/1 0:18:41,202010,18,1,,
1101,2020-10-02 08:19:41+00:00,46.7236,131.1396,0.1,,0,2020/10/2 16:19:41,202010,18,1,,
1101,2020-10-02 08:24:41+00:00,46.7236,131.1396,0.1,,0,2020/10/2 16:24:41,202010,18,1,,
1101,2020-10-02 08:29:41+00:00,46.7236,131.1396,0.1,,0,2020/10/2 16:29:41,202010,18,1,,
1101,2020-10-02 08:34:41+00:00,46.7236,131.1396,0.1,,0,2020/10/2 16:34:41,202010,18,1,,
1101,2020-10-02 08:39:41+00:00,46.7236,131.1396,0.1,,0,2020/10/2 16:39:41,202010,18,1,,
1101,2020-10-02 08:44:41+00:00,46.7236,131.1396,0.1,,0,2020/10/2 16:44:41,202010,18,1,,
1101,2020-10-02 08:49:41+00:00,46.7236,131.1396,0.1,,0,2020/10/2 16:49:41,202010,18,1,,
1101,2020-10-06 11:11:10+00:00,46.7245,131.14015,0.1,,2.1,2020/10/6 19:11:10,202010,18,1,,
1101,2020-10-06 11:16:10+00:00,46.7245,131.14015,0.1,,2.2,2020/10/6 19:16:10,202010,18,1,,
1101,2020-10-06 11:21:10+00:00,46.7245,131.14015,0.1,,3.84,2020/10/6 19:21:10,202010,18,1,,
1101,2020-10-06 16:46:10+00:00,46.7245,131.14015,0,,0,2020/10/7 0:46:10,202010,18,1,,
1101,2020-10-07 04:44:27+00:00,46.724366,131.1402,1,,0,2020/10/7 12:44:27,202010,18,1,,
1101,2020-10-07 04:49:27+00:00,46.724366,131.1402,1,,0,2020/10/7 12:49:27,202010,18,1,,
1101,2020-10-07 04:54:27+00:00,46.724366,131.1402,1,,0,2020/10/7 12:54:27,202010,18,1,,
1101,2020-10-07 04:59:27+00:00,46.724366,131.1402,1,,0,2020/10/7 12:59,202010,18,1,,
1101,2020-10-07 05:04:27+00:00,46.724366,131.1402,1,,0,2020/10/7 13:04:27,202010,18,1,,

我用这段代码获取数据帧中速度为0的数据,然后根据纬度、经度、年、月、日对数据帧进行分组。

分组后,获取每组的第一个upload_time_add_8hour和最后一个upload_time_add_8hour。如果第一个upload_time_add_8hour和最后一个upload_time_add_8hour之间的差异超过5分钟,则获取每组的第一行数据,并最终将这些数据保存到csv中。

我认为我的代码不够简洁。

我使用df\u first\u row=sub\u df。iloc[0:1,:]要获取数据帧中的第一行,我使用upload\u time\u add\u 8hour\u first=sub\u df['upload\u time\u add\u 8hour']。iloc[0]上载时间添加时间最后一次=子时间df['upload\u time\u add\u 8hour']。iloc[-1]获取特定列的第一个元素和最后一个元素。

还有更合适的方法吗?

我的代码:

import pandas as pd

device_csv_name = r'E:/test.csv'
df = pd.read_csv(device_csv_name, parse_dates=[7], encoding='utf-8', low_memory=False)
df['upload_time_year_month_day'] = df['upload_time_add_8hour'].dt.strftime('%Y%m%d')
df['upload_time_year_month_day'] = df['upload_time_year_month_day'].astype(str)
df_speed0 = df[df['speed'].astype(float) == 0.0] #Get data with speed is 0.0
gb = df_speed0.groupby(['latitude', 'longitude', 'upload_time_year_month_day'])
sub_dataframe_list = []
for i in gb.indices:
    sub_df = pd.DataFrame(gb.get_group(i))
    sub_df = sub_df.sort_values(by=['upload_time_add_8hour'])
    count_row = sub_df.shape[0] #get row count
    if count_row>1: #each group must have more then 1 row
        upload_time_add_8hour_first = sub_df['upload_time_add_8hour'].iloc[0]  # get first upload_time_add_8hour
        upload_time_add_8hour_last = sub_df['upload_time_add_8hour'].iloc[-1]  # get last upload_time_add_8hour
        minutes_diff = (upload_time_add_8hour_last - upload_time_add_8hour_first).total_seconds() / 60.0
        if minutes_diff >= 5: # if minutes_diff>5,append the first row of dataframe to sub_dataframe_list
            df_first_row  = sub_df.iloc[0:1,:]
            sub_dataframe_list.append(df_first_row)

if sub_dataframe_list:
    result = pd.concat(sub_dataframe_list,ignore_index=True)
    result = result.sort_values(by=['upload_time'])
    result.to_csv(r'E:/for_test.csv', index=False, mode='w', header=True,encoding='utf-8')

共有2个答案

夏华藏
2023-03-14

你的出路是Groupby(). aggdf. agg

如果您需要它,根据设备,您可以

#sub_df.groupby('device_id')['upload_time_add_8hour'].agg(['first','last'])


sub_df.groupby('device_id')['upload_time_add_8hour'].agg([('upload_time_add_8hour_first','first'),('upload_time_add_8hour_last ','last')]).reset_index()


device_id upload_time_add_8hour_first    upload_time_add_8hour_last 
0       1101              10/1/2020 0:03             10/7/2020 13:04

如果你不希望它按设备,也许尝试

sub_df['upload_time_add_8hour'].agg({'upload_time_add_8hour_first': lambda x: x.head(1),'upload_time_add_8hour_last': lambda x: x.tail(1)})

upload_time_add_8hour_first  0      10/1/2020 0:03
upload_time_add_8hour_last   19    10/7/2020 13:04
锺离旻
2023-03-14

要获取列的第一个和最后一个元素,您的选项已经是最有效/正确的方法。如果您对本主题感兴趣,我建议您阅读另一个答案:https://stackoverflow.com/a/25254087/8294752

为了获得第一行,我个人更喜欢使用DataFrame.head(1),因此对于您的代码来说,如下所示:

df_第一行=sub_df。标题(1)

我没有研究Pandas中如何定义head()方法及其性能影响,但在我看来,它提高了可读性并减少了与索引的一些潜在混淆。

在其他示例中,您可能还会发现sub_df。iloc[0],但此选项将返回一个。系列,它以数据帧列名作为索引<代码>sub_df。head(1)将返回一行数据帧,这与sub_df的结果相同。iloc[0:1,:]

 类似资料:
  • 我有一个熊猫,如下所示: 我想按进行分组并获取每个组的第一行: 预期成果: 我尝试了下面的方法,它只给出了< code>DataFrame的第一行。任何关于这方面的帮助都将不胜感激。

  • 问题内容: 我发现了一些在servlet中获取ip的方法。但我不知道哪一个是正确的,为什么。 1: 2: 3: 问题答案: 答案很复杂。 如果您的Servlet在反向代理或负载平衡器后面的Web服务器上运行,则可以将该Web代理配置为注入请求标头,该标头提供了请求来自的IP地址。不同的反向代理将注入不同的标头。请查阅您的(前端)服务器的文档。 如果您的客户端使用(转发)代理,则它 可能会 插入标头

  • 问题内容: 这是我的JSF页面: 和豆 当我传递这样的参数时:/getshipment.xhtml?id=123 我得到输出 1 = 2 = 123 3 = 123 第二和第三种方法工作正常。为什么第一个不工作?什么是获取参数的正确方法? 问题答案: 尝试使用GlassFish 4至少使用2.2.2。先前的2.2.x Mojarra版本与新的JSF名称空间存在众所周知的兼容性问题。

  • 问题内容: 我要进行Flask + Nginx + Gunicorn部署。我已经安装并正在运行Nginx,并且按照文档中的说明运行gunicorn: 但是,当我注销服务器时,gunicorn进程退出了吗?确保Nginx保持连接状态并在崩溃时重新启动的正确方法是什么? 问题答案: 运行Gunicorn时使用选项。例:

  • 问题内容: 在PHP系统中,我有一个常见的MVC情况:从包含的数据中接收请求。现在,我有三种方法来处理数据: a)仅调用和处理数据。 b)在变换的数据转换成变量,并将它们传递到。 c)将数据转换为的域对象,并将该对象仅传递给。 目前,我正在使用选项A,但是我认为这是错误的,因此我正在考虑使用选项C。 因此,根据MVC,处理数据的正确方法是什么? 编辑 目前,我没有使用任何MVC框架。 编辑2 通常

  • 问题内容: 这些方法之间在功能上有区别吗? 编辑(从其他贡献者添加了此语法): 问题答案: 不,但第一个是首选样式。 编辑: 另一个选项是 此外,它还允许调用者使用varargs语法。