我有一个数据集,其中每条记录包含用户推文的日期,屏幕名称,关注者数量和朋友数。用户可以在整个数据集中多次列出,并且在不同时间以及在不同时间具有不同的关注者/朋友计数。我想要做的是获取列表中的唯一用户列表及其最近关注者/朋友计数。我不想只是在屏幕名称上删除重复,而是我想要他们最近的值。
这是我的数据目前的重复值
In [14]: data
Out[14]:
[(datetime.datetime(2014, 11, 21, 1, 16, 2), u'AlexMatosE', 773, 560),
(datetime.datetime(2014, 11, 21, 1, 17, 6), u'hedofthebloom', 670, 618),
(datetime.datetime(2014, 11, 21, 1, 18, 8), u'hedofthebloom', 681, 615),
(datetime.datetime(2014, 11, 21, 1, 19, 1), u'jape2116', 263, 540),
(datetime.datetime(2014, 11, 21, 1, 19, 3), u'_AlexMatosE', 790, 561),
(datetime.datetime(2014, 11, 21, 1, 19, 5), u'Buffmuff69', 292, 270),
(datetime.datetime(2014, 11, 21, 1, 20, 1), u'steveamodu', 140, 369),
(datetime.datetime(2014, 11, 21, 1, 20, 9), u'jape2116', 263, 540),
(datetime.datetime(2014, 11, 21, 1, 21, 3), u'chighway', 363, 767),
(datetime.datetime(2014, 11, 21, 1, 22, 9), u'jape2116', 299, 2000)]
这就是我如何获取数据中的唯一身份用户
In [15]: users = set(sorted([line[1] for line in data]))
现在我需要弄清楚如何为数据集中的每个唯一用户获取MOST RECENT值集。我不确定for循环是否是最好的方式,或者其他东西会更好。
In [18]: most_recent_user_data = []
....: for line in data:
....: if line[1] in users:
....: ...
....: ...
....: ...
....: most_recent_user_data.append((line[1], line[2], line[3]))
终极,我希望每个独特的用户一次,最近的追随者/朋友价值
In [19]: most_recent_user_data
Out[19]:
(u'hedofthebloom', 681, 615),
(u'_AlexMatosE', 790, 561),
(u'Buffmuff69', 292, 270),
(u'steveamodu', 140, 369),
(u'chighway', 363, 767),
(u'jape2116', 299, 2000)]
答案 0 :(得分:1)
您可以在groupby
模块中使用itertools
功能:
import datetime
import itertools
data = [(datetime.datetime(2014, 11, 21, 1, 16, 2), u'AlexMatosE', 773, 560),
(datetime.datetime(2014, 11, 21, 1, 17, 6), u'hedofthebloom', 670, 618),
(datetime.datetime(2014, 11, 21, 1, 18, 8), u'hedofthebloom', 681, 615),
(datetime.datetime(2014, 11, 21, 1, 19, 1), u'jape2116', 263, 540),
(datetime.datetime(2014, 11, 21, 1, 19, 3), u'_AlexMatosE', 790, 561),
(datetime.datetime(2014, 11, 21, 1, 19, 5), u'Buffmuff69', 292, 270),
(datetime.datetime(2014, 11, 21, 1, 20, 1), u'steveamodu', 140, 369),
(datetime.datetime(2014, 11, 21, 1, 20, 9), u'jape2116', 263, 540),
(datetime.datetime(2014, 11, 21, 1, 21, 3), u'chighway', 363, 767),
(datetime.datetime(2014, 11, 21, 1, 22, 9), u'jape2116', 299, 2000)]
# sorted record by name and datetime
data = sorted(data, key=lambda x: (x[1], x[0]), reverse=True)
# group by username and get the most recent user data
most_recent_user_data = [[(lambda x: (x[1], x[2], x[3]))(next(v)) for k, v in itertools.groupby(data, key=lambda x: x[1])]]
结果:
[('steveamodu', 140, 369),
('jape2116', 299, 2000),
('hedofthebloom', 681, 615),
('chighway', 363, 767),
('_AlexMatosE', 790, 561),
('Buffmuff69', 292, 270),
('AlexMatosE', 773, 560)]
答案 1 :(得分:0)
一种方法是使用字典并使用用户名作为键。对于每个密钥,您将拥有一个用户数据列表,您可以根据需要对其进行排序。以下是一种方法:
from collections import defaultdict
# move data to a dict
dataDict = defaultdict(list)
for v in data:
dataDict[v[1]] += [v]
# sort user data for each user/key
for u,v in dataDict.items():
dataDict[u] = sorted(v, reverse=True)
# get first (i.e. most recent) values for each user
for u,v in dataDict.items():
print(u,v[0][-2], v[0][-1])
结果是:
(u'chighway', 363, 767)
(u'AlexMatosE', 773, 560)
(u'hedofthebloom', 681, 615)
(u'steveamodu', 140, 369)
(u'Buffmuff69', 292, 270)
(u'_AlexMatosE', 790, 561)
(u'jape2116', 299, 2000)
答案 2 :(得分:0)
使用字典存储每个用户的最新数据。
latests = {}
for d in data:
if d[0] > latests.setdefault(d[1], d)[0]:
latests[d[1]] = d
results = [(d[1], d[2:]) for d in latests.values()]
from pprint import pprint
pprint(results)
答案 3 :(得分:0)
获得所需结果的另一种方法:
from operator import itemgetter
# sort the data using time as the key
data.sort(key=itemgetter(0), reverse=True)
# remove duplicated users from the data
def uniq(seq):
seen = set()
seen_add = seen.add
return [(x[1], x[2], x[3]) for x in seq if not (x[1] in seen or seen_add(x[1]))]
uniq(data)
给出:
[('jape2116', 299, 2000),
('chighway', 363, 767),
('steveamodu', 140, 369),
('Buffmuff69', 292, 270),
('_AlexMatosE', 790, 561),
('hedofthebloom', 681, 615),
('AlexMatosE', 773, 560)]
我正在使用this thread中提到的方法。
答案 4 :(得分:0)
您按相反的时间顺序对数据集进行排序,并在用户首次出现时添加到字典或附加到列表中:
import datetime
users = {}
for d in reversed(data):
if d[1] not in users: users[d[1]] = tuple(d[2:])
# {'_AlexMatosE': (790, 561), 'steveamodu': (140, 369), 'jape2116': (299, 2000), 'chighway': (363, 767), 'AlexMatosE': (773, 560), 'hedofthebloom': (681, 615), 'Buffmuff69': (292, 270)}