熊猫:在其他列中获取每个包含特定值的用户的最后一个值

时间:2019-07-26 23:17:20

标签: python pandas

我有一个如下数据框:

user        item      
A           1           
A           2          
A           2           
B           3           
B           4
B           4   

通常,我将如何返回这样的数据帧:

user        item      
A           2          
A           2           
B           4
B           4

您为每个用户返回的行包含该用户的最后一项值?

在按用户分组后,我尝试了.last()方法,但它只会为A和B提供一个实例。

4 个答案:

答案 0 :(得分:2)

您使用transform

df[df.item==df.groupby('user').item.transform('last')]
Out[292]: 
  user  item
1    A     2
2    A     2
4    B     4
5    B     4

答案 1 :(得分:0)

您可以通过执行以下操作来完成所需的操作。

data = {
    'user': ['A', 'A', 'A', 'B', 'B', 'B'],
    'items': [1, 2, 2, 3, 4, 4]
}

df = pd.DataFrame(data)
df.groupby('user').tail(2)

输出

user    items
A       2
A       2
B       4
B       4

答案 2 :(得分:0)

设置数据:

data = [     
['A',1 ],          
['A',2 ] ,        
['A',2 ]  ,        
['B',3 ],       
['B',4],
['B', 4 ]
]
df = pd.DataFrame(data, columns=['user',  'item'])

对last进行group_by,然后将其合并回原始df:

grouped_df = pd.DataFrame(df.groupby('user').item.last()).reset_index()
pd.merge(df, grouped_df, on=['user', 'item'], how='inner') 

   user item
0   A   2
1   A   2
2   B   4
3   B   4

答案 3 :(得分:0)

我能想到的更通用的解决方案:

df['dupl'] = df.duplicated()

def lastdup(x):
    idx = x.loc[~x['dupl']].index[-1]
    return x.loc[idx:]

ddf = df.groupby('user').apply(lastdup)
ddf.drop('dupl', inplace=True, axis=1)

首先在列中保存一个布尔值以标记重复的行。然后使用groupby:在eack组中,查找最后一个非重复行的索引,然后从该行返回到组的末尾。

此解决方案最后将适用于任意数量的重复行。这个数字可能因组而异,您无需事先知道。

例如,如果您使用此输入(请注意示例中额外的A 2行):

user        item      
A           1           
A           2          
A           2
A           2           
B           3           
B           4
B           4   

您将获得:

       user  item
user             
A    1    A     2
     2    A     2
     3    A     2
B    5    B     4
     6    B     4