我有一个如下数据框:
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提供一个实例。
答案 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