如何在每行之后插入每个组的最后一行

时间:2019-12-03 21:24:37

标签: python-3.x pandas dataframe

我需要在同一组的每一行之后复制每个id组的最后一行 max(num)

import pandas as pd

data = [{'id': 110, 'val1': 'A', 'num': 0}, 
        {'id': 110, 'val1': 'B', 'num': 1}, 
        {'id': 110, 'val1': 'C', 'num': 2},
        {'id': 220, 'val1': 'E', 'num': 0}, 
        {'id': 220, 'val1': 'F', 'num': 1}, 
        {'id': 220, 'val1': 'G', 'num': 2},
        {'id': 220, 'val1': 'X', 'num': 3},
        {'id': 300, 'val1': 'H', 'num': 0}, 
        {'id': 300, 'val1': 'I', 'num': 1}] 

df = pd.DataFrame(data)
df

我的数据框:

enter image description here

我要寻找的东西

enter image description here

1 个答案:

答案 0 :(得分:1)

这是mergewide_to_long的一种方法,drop_duplicates假设数据帧是有序的,如果不正确,请首先使用sort_values

s=df.merge(df.drop_duplicates('id',keep='last'),on='id').query('val1_x!=val1_y').reset_index()
newdf=pd.wide_to_long(s,['val1','num'],i=['index','id'],j='drop',suffix='\\w+').\
         reset_index('id').reset_index(drop=True)
newdf
     id val1  num
0   110    A    0
1   110    C    2
2   110    B    1
3   110    C    2
4   220    E    0
5   220    X    3
6   220    F    1
7   220    X    3
8   220    G    2
9   220    X    3
10  300    H    0
11  300    I    1