【问题标题】:Grouping by and performing count on columns WITHOUT pandas in Python在 Python 中对没有 pandas 的列进行分组并执行计数
【发布时间】:2021-06-14 15:41:21
【问题描述】:

我有一个包含多个列的数据框,包括流平台的 family_IDuser_ID。我要做的是在这个数据框中找到哪些家庭 ID 与他们关联的唯一用户最多 . 用于此的 SQL 代码是:

SELECT   TOP 5 family_id,
         Count(distinct user_id) AS user_count
FROM     log_edit
WHERE    family_id <> ''
GROUP BY family_id
ORDER BY user_count DESC;

使用 pandas 我可以得到相同的结果:

df.groupby('family_id')['user_id'].nunique().nlargest(5)

我的问题是,我怎样才能在不使用 Pandas 或 SQL 的情况下获得相同的结果?我可以使用 Pandas 导入 .csv,但必须在没有它的情况下进行分析。处理此案的最佳方法是什么?

如果它是一个数组,我假设结果类似于[1,2,3,4,5] [9,7,7,7,5],其中 1->5 是家庭 id,另一个数组是注册到他们的用户 id 的数量(按降序排序,限制为 5 个结果)

谢谢!

【问题讨论】:

  • 我不清楚你在问什么。你有一个 csv(?) 但不想使用 SQL 或 pandas,但你没有指定你确实想如何解决这个问题。
  • @HenryEcker 是的,我有一个 csv 文件,除了读取 csv 之外我不能使用 pandas,但也许 numpy 来分析它。我不完全确定如何自己解决这样的问题,这就是我在这里问这个问题的原因。

标签: python sql pandas numpy


【解决方案1】:

由于您将numpy 放在标签中,我假设您可能想要使用它。在这种情况下,您可以使用np.unique

import numpy as np

family_id = [9,7,7,7,5,5]
top_k = 2

unique_family_ids, counts = np.unique(family_id, return_counts=True)

# Use - to sort from largest to smallest
sort_idx = np.argsort(-counts)

for idx in sort_idx[:top_k]:
    print(unique_family_ids[idx], 'has', counts[idx], 'unique user_id')

如果您想像在 SQL 查询中那样处理缺失的 id,您必须知道它们是如何精确编码的...

【讨论】:

  • 感谢您的回复!只是我理解正确,由于未导入另一列中的 user_id,它是如何工作的?另外,如何转换包含 11 列的数据框,包括 user_id 和 family_id 以适应此代码?
  • 对不起,我可能有点草率,我只是假设每个用户都有一个唯一的 user_id;如果是这样,您根本不需要使用它(您不需要知道特定的用户 id 就知道他们有多少)。如果存在具有相同用户 ID 的重复行(假设它们定义明确,即相同的 user_id 始终映射到相同的 family_id),您首先需要丢弃重复的行,例如在执行上述代码中的任何其他操作之前,先执行_, unique_id = np.unique(user_id, return_index=True),然后执行family_id = family_id[unique_id]
  • 至于其他列,你根本不需要使用它们......
  • 在此评论中尝试您的第一个代码时出现此错误:NameError: name 'user_id' is not defined。如何将它连接到数组来定义它?
猜你喜欢
  • 2020-02-13
  • 2015-10-06
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
  • 2018-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多