我处在获取各种项目数据的情况,有时某个项目的某些字段会更改。我正在寻找一种简单的方法来检测何时发生了变化。这是一个例子。假设有这样的话:
df = pd.DataFrame({'ID': [1, 1, 1, 2, 3, 2],
'SUBID': [1, 2, 1, 1, 1, 1],
'val1': [1, 4, 1, 7, 10, 8],
'val2': [2, 5, 2, 8, 11, 9],
'val3': [3, 6, 4, 9, 12, 9],
'date': ['20200413', '20200413', '20200414', '20200414',
'20200415', '20200416']})
ID SUBID val1 val2 val3 date
1 1 1 2 3 20200413
1 2 4 5 6 20200413
1 1 1 2 4 20200414
2 1 7 8 9 20200414
3 1 10 11 12 20200415
2 1 8 9 9 20200416
我想给我一个像这样的操作
ID SUBID col date prev new
0 1 1 val3 20200414 3 4
1 2 1 val1 20200416 7 8
2 2 1 val2 20200416 8 9
谢谢!
答案 0 :(得分:2)
IIUC,您可以执行以下操作:首先用set_index
,stack
重塑数据框,然后用groupby
修改日期agg
的某些列,用{{1 }}和/或first
,然后last
就可以只过滤已更改的内容。
query
答案 1 :(得分:2)
这是我使用GroupBy.shift
和DataFrame.melt
的方法
new_df = (df.melt(['ID','SUBID','date'], value_name='new')
.assign(prev=lambda x: x.groupby(['ID','SUBID','variable'])['new']
.shift())
.loc[lambda x: ~x['new'].eq(x['prev']) & x['prev'].notna()]
.sort_values(['ID','SUBID']))
print(new_df)
ID SUBID date variable new prev
14 1 1 20200414 val3 4 3.0
5 2 1 20200416 val1 8 7.0
11 2 1 20200416 val2 9 8.0