【发布时间】:2018-08-01 11:10:30
【问题描述】:
我有一个这样的 +100K 行的数据框:
user document
0 john book
1 jane article
2 jane book
3 jane book
4 jim article
5 john book
6 jim blogpost
7 jane blogpost
8 jane blogpost
9 jane blogpost
我需要这样的数据框:
blogpost article book
john 1 3 0
jane 0 0 1
jim 4 0 2
也就是说,我需要每个user, document 组合的下载次数。
我在做.groupby(['user', 'document'])然后用df.loc设置下载号:
df = pd.DataFrame(index=users, columns=documents)
df.fillna(0, inplace=True)
grouped = records.groupby(['user', 'document'])
for elem in grouped:
user, document = elem[0]
downloads = len(elem[1])
df.loc[user, document] = downloads
但是,df.loc 以这种方式使用时非常慢...我已经注释掉了 df.loc.. 行,发现循环完成得很快,所以几乎可以肯定是 df.loc 访问速度很慢。
我怎样才能更快地得到这个结果?
最小工作示例:
records = pd.DataFrame([
('john', 'book'),
('jane', 'article'),
('jane','book'),
('jane','book'),
('jim', 'article'),
('john', 'book'),
('jim', 'blogpost'),
('jane', 'blogpost'),
('jane', 'blogpost'),
('jane', 'blogpost')
], columns=['user', 'document'])
print(records)
users = list(set(records['user']))
users.sort()
documents = list(set(records['document']))
documents.sort()
print(users)
print(documents)
df = pd.DataFrame(index=users, columns=documents)
df.fillna(0, inplace=True)
print(df)
grouped = records.groupby(['user', 'document'])
for elem in grouped:
user, document = elem[0]
downloads = len(elem[1])
df.loc[user, document] = downloads
【问题讨论】:
-
我也经历过同样的事情。它确实很慢。相反,我在循环之外定义了 empy 列表,并将数据附加到列表中,并将 df 的特定列添加到这些列表中。它更快。
标签: python pandas pandas-groupby