保留Pandas中最后N个重复项

12

给定一个数据框:

>>> import pandas as pd
>>> lol = [['a', 1, 1], ['b', 1, 2], ['c', 1, 4], ['c', 2, 9], ['b', 2, 10], ['x', 2, 5], ['d', 2, 3], ['e', 3, 5], ['d', 2, 10], ['a', 3, 5]]
>>> df = pd.DataFrame(lol)

>>> df.rename(columns={0:'value', 1:'key', 2:'something'})
  value  key  something
0     a    1          1
1     b    1          2
2     c    1          4
3     c    2          9
4     b    2         10
5     x    2          5
6     d    2          3
7     e    3          5
8     d    2         10
9     a    3          5

目标是对于 key 列的唯一值,保留最后的 N 行。

如果 N=1,我可以使用以下方式简单地使用 .drop_duplicates() 函数:

>>> df.drop_duplicates(subset='key', keep='last')
  value  key  something
2     c    1          4
8     d    2         10
9     a    3          5

如何保留每个唯一的key的最后3行?


我可以尝试这样做:N=3

>>> from itertools import chain
>>> unique_keys = {k:[] for k in df['key']}
>>> for idx, row in df.iterrows():
...     k = row['key']
...     unique_keys[k].append(list(row))
... 
>>>
>>> df = pd.DataFrame(list(chain(*[v[-3:] for k,v in unique_keys.items()])))
>>> df.rename(columns={0:'value', 1:'key', 2:'something'})
  value  key  something
0     a    1          1
1     b    1          2
2     c    1          4
3     x    2          5
4     d    2          3
5     d    2         10
6     e    3          5
7     a    3          5

但一定有更好的方法......

2个回答

18

这是你想要的吗?

df.groupby('key').tail(3)
Out[127]: 
  value  key  something
0     a    1          1
1     b    1          2
2     c    1          4
5     x    2          5
6     d    2          3
7     e    3          5
8     d    2         10
9     a    3          5

嗯,我认为是对的!只有一件事,在groupby之后,结果是列表还是集合?因为这里分组键的顺序很重要。 - alvas
2
精彩的回答。+1 - cs95
1
同样地,iloc[:-3]也可以进行轻微修改后使用。 - cs95
1
@alvas Yw~基本上如帮助文件所述将返回结果作为系列 - BENY
如果顺序很重要,groupby有(...sort=True...)。返回的是一个数据框。type(df.groupby('key').tail(3))。 - Merlin
显示剩余2条评论

1

Does this help:

for k,v in df.groupby('key'):
    print v[-2:]

  value  key  something
1     b    1          2
2     c    1          4
  value  key  something
6     d    2          3
8     d    2         10
  value  key  something
7     e    3          5
9     a    3          5

我认为@Wen的tail(N)解决方案更加简洁。 - alvas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接