【问题标题】:Dataframe group by value, remove duplicates, but save non similar entries? Python数据框按值分组,删除重复项,但保存不相似的条目? Python
【发布时间】:2020-01-09 04:50:10
【问题描述】:

有没有办法在 python 中扫描数据框以创建一个按特定列分组的新数据框,删除重复项,同时将不相似的条目保存到列表中?

如果我有一个看起来像这样的数据框...

Genre     Rating   CustomRating
Thriller  5        5
Thriller  5        5
Comedy    9        9
Action    3        6
Action    2        7

我需要它变成这样的东西......

Genre     Rating   CustomRating
Thriller  5        5
Comedy    9        9
Action    3, 2     6, 7

进度更新

@ignoring_gravity 建议 df.drop_duplicates().groupby('Genre', sort=False).agg(list) 的工作效果很好,但是有没有办法将项目返回为字符串或 int 而不是列表?

【问题讨论】:

  • 您能否举例说明在Thriller, 5, 6 附加行的情况下的预期输出?目前尚不清楚什么是“重复”
  • @ALollz 在这种情况下该行看起来... Thriller 5 5 ,6 其中Raiting 得分相同,但CustomRating 注意到两个不同的得分.

标签: python pandas dataframe


【解决方案1】:

你可以先groupby,然后agg

df.groupby('Genre', sort=False).agg(lambda x: list(set(x))).reset_index()

你会得到

      Genre  Rating CustomRating
0  Thriller     [5]          [5]
1    Comedy     [9]          [9]
2    Action  [2, 3]       [6, 7]

【讨论】:

  • 效果很好。有没有办法做到这一点,它会返回一个字符串或一个 int 而不是一个列表?
  • @rwjam 我认为用lambda x: ', '.join([str(i) for i in list(set(x))]) 替换聚合函数应该可以,你可以试试吗?
【解决方案2】:

不,默认情况下没有。您可以使用groupby,后跟agg,并按照其他人的建议创建list。但是,不鼓励这样做是有充分理由的;)

您的第二个 DataFrame 非常难以使用。您现在永远无法确定它是否包含单个值或列表。这与 DataFrame 的整体理念背道而驰。你也失去了信息。哪里有多少动作片?自定义评分 6 的评分是 2 还是 3。你不能再回答这些问题了。你接下来会做什么?计算汇总统计量?然后直接使用groupby().mean()groupby().std() 或者你需要的任何东西?策划那个?甚至还有一个groupby().plot()

如果你想做这样的事情,这是一个明显的信号,你应该考虑一下你为什么需要这样做。 pandas 中的一般模式称为 split-apply-combine。你试图只做拆分部分。我建议您仅在有充分理由这样做时才这样做。

【讨论】:

  • "您现在永远无法确定它是否包含单个值或列表。"它总是包含一个列表
  • 他提出问题的方式是混合标量值和集合。如果您愿意,您实际上可以使用apply 来执行此操作。但事实上,对于您的解决方案,它始终是一个列表,我同意这是更好的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
  • 1970-01-01
  • 1970-01-01
  • 2010-12-25
相关资源
最近更新 更多