Pandas是在考虑多行的情况下迭代df的最有效方法

2024-09-30 03:22:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据帧:

               id                         step_description  site  \
0          1233211020                                1      3242342j3kas   
2          1233211020                                1      deeqmkw213   
20         1233211020                                2      123321   
49         1233211020                                1      123321   
                  spotted_on  group  
0  2021-02-15 14:57:50+00:00  test1  
2  2021-02-13 14:36:55+00:00  test1  
20 2021-02-11 18:41:00+00:00  test1  
49 2021-02-10 07:25:00+00:00  test1  

我想创建一个新的dataframe,它将实现以下功能: 如果已在站点123321和站点deeqmkw213上发现id,则新df将如下所示:

id           spotted_on                     origin_site    destination_site      group  order 
1233211020   2021-02-10 07:25:00+00:00      123321         123321                test1    1
1233211020   2021-02-13 14:36:55+00:00      123321         deeqmkw213            test1    2
1233211020   2021-02-15 14:57:50+00:00      deeqmkw213     3242342j3kas          test1    3

我实际上有一个可行的解决方案,但我仍在学习熊猫,不知道是否有更有效的方法来做到这一点。 而且,我的sulotion目前缺少对第一行的处理,这应该是最早的条目(索引0处的行)

  • 可以有多个ID,所以我分组,并将下面的方法应用于每个组

我的解决方案:

def _create_orders_by_ids(self, ids_grouped_data):
        data = []
        idx = 0
        next_idx = 1
        order = 1
        animal_grouped_data.sort_values(by=SPOTTED_ON, inplace=True)
        while next_idx < len(animal_grouped_data):
            row = animal_grouped_data.iloc[idx]
            next_row = animal_grouped_data.iloc[next_idx]
            if next_row.site == row.site:
                idx += 1
                next_idx += 1
            else:
                data.append({id: row.id,
                             ORIGIN_SITE: row.site,
                             DESTINATION_SITE: next_row.site,
                             DATE: row.spotted_on,
                             GROUP: row.group,
                             ORDER: order})
                order += 1
                idx += 1
                next_idx += 1
        df = pd.DataFrame(data)
        return df

Tags: iddfdataongroupsiteordernext

热门问题