按组检测行更改并将结果返回到原始数据框

问题描述 投票:0回答:1

这是我的例子。我正在分组、排序并检测从一行到另一行的变化。

import pandas as pd
import datetime

my_df = pd.DataFrame({'col1': ['a', 'a', 'a', 'a', 'b', 'b', 'b'],
                      'col2': [2, 2, 3, 2, 5, 5, 5],
                      'col3': [datetime.date(2023, 2, 1),
                               datetime.date(2023, 3, 1),
                               datetime.date(2023, 5, 1),
                               datetime.date(2023, 4, 1),
                               datetime.date(2023, 3, 1),
                               datetime.date(2023, 2, 1),
                               datetime.date(2023, 4, 1)]})

my_df_temp = my_df.sort_values(by=['col3']).groupby('col1')['col2'].apply(
    lambda x: x != x.shift(1)
).reset_index(name='col2_change')

现在我想将结果返回到

my_df
,即我希望
my_df
有列
col2_change

简单的分配是行不通的

my_df['col2_change'] = my_df_temp.col2_change.values

我可以做到的一种方法是通过两列

my_df
col1
col3
进行排序,然后简单地分配,但看起来有点费力。有没有更简单的方法?

pandas group-by apply
1个回答
0
投票

你的方法实际上相当不错,但如果你有一个更简洁的方法,同时也消除了重置的开销,你可以这样做:

import pandas as pd
import datetime

my_df = pd.DataFrame({'col1': ['a', 'a', 'a', 'a', 'b', 'b', 'b'],
                      'col2': [2, 2, 3, 2, 5, 5, 5],
                      'col3': [datetime.date(2023, 2, 1),
                               datetime.date(2023, 3, 1),
                               datetime.date(2023, 5, 1),
                               datetime.date(2023, 4, 1),
                               datetime.date(2023, 3, 1),
                               datetime.date(2023, 2, 1),
                               datetime.date(2023, 4, 1)]})

my_df['col2_change'] = (
    my_df.sort_values(by='col3')
    .groupby('col1')['col2']
    .transform(lambda x: x != x.shift(1))
)

print(my_df)

这给出了

  col1  col2        col3  col2_change
0    a     2  2023-02-01         True
1    a     2  2023-03-01        False
2    a     3  2023-05-01         True
3    a     2  2023-04-01        False
4    b     5  2023-03-01        False
5    b     5  2023-02-01         True
6    b     5  2023-04-01        False
© www.soinside.com 2019 - 2024. All rights reserved.