这是我的例子。我正在分组、排序并检测从一行到另一行的变化。
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
进行排序,然后简单地分配,但看起来有点费力。有没有更简单的方法?
你的方法实际上相当不错,但如果你有一个更简洁的方法,同时也消除了重置的开销,你可以这样做:
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