为了账号安全,请及时绑定邮箱和手机立即绑定

按行条件计数保留所有列而不迭代数据帧

按行条件计数保留所有列而不迭代数据帧

哆啦的时光机 2023-09-12 20:02:02
我正在努力解决熊猫的条件计数问题。问题我有一个 pandas 数据框,有 4 列(为了这个例子):“id”、“id2”、“col1”和“type”。类型列可以有3个值,即“A”、“B”和“C”。我想做的是,对于每一行,计算具有相同 id 和 id2 的类型 C 的数量。这是一个示例数据框:    id   id2 col1 type0   "e"  "z"   0   "A"1   "e"  "z"   1   "C"2   "e"  "z"   2   "C"3   "e"  "y"   3   "C"4   "e"  "y"   4   "A"  5   "f"  "y"   4   "A"6   "f"  "x"   3   "B"7   "f"  "x"   4   "B"8   "g"  "w"   5   "C"9   "g"  "w"   6   "B"构建示例数据框的代码:pd.DataFrame({    "id":   ["e", "e", "e", "e", "e", "f", "f", "f", "g", "g"],    "id2":  ["z", "z", "z", "y", "y", "x", "x", "x", "w", "w"],    "col1": [ 0 ,  1 ,  2 ,  3 ,  4 ,  4 ,  3 ,  4 ,  5 ,  6 ],    "type": ["A", "C", "C", "C", "A", "A", "B", "B", "C", "B"]})以及期望的结果:    id   id2 col1 type  count0   "e"  "z"   0   "A"    21   "e"  "z"   1   "C"    22   "e"  "z"   2   "C"    2 3   "e"  "y"   3   "C"    14   "e"  "y"   4   "A"    15   "f"  "y"   4   "A"    06   "f"  "x"   3   "B"    07   "f"  "x"   4   "B"    08   "g"  "w"   5   "C"    19   "g"  "w"   6   "B"    1我并不真正关心类型为“C”的行(例如第1、2、3、8行)会发生什么,所以如果它们没有出现在结果数据框中,这不是问题。我想要一个不依赖于通过数据集迭代“我自己”的解决方案(不应用也不for循环),因为它们太慢了。我希望找到一种解决问题的“pandaic”方法。注意:在“真实”数据集中,有 3 列用于索引,类型可以有 5 个不同的值,并且应保留 36 个数据列。但我更喜欢可扩展的解决方案,不受这些数量的限制。我尝试过的我可以使用 sqlalchemy 和查询来解决问题。事实上,结果应该与以下查询匹配:SELECT a.*, (SELECT COUNT(*)             FROM df b             WHERE                  b.id  = a.id  AND                 b.id2 = a.id2 AND                 b.type = "C")FROM df a最初的问题也可以改写为“相当于这个查询的Python代码是什么?”。我也可以使用 apply 来解决问题。由于数据集的大小,两者都非常慢,尽管 sql 方法可能很慢,因为它必须首先构建数据库。相关文章这篇文章几乎解决了问题,但不适用于外部数据列,也不适用于多个索引,并且我无法将它们适应我的示例。这条线接近我正在寻找的内容,唯一的问题是它只保留您分组的列:df.groupby(["id", "id2", "type"]).size().unstack().reset_index()如果缺少任何信息,请告诉我。感谢您花时间阅读我的帖子,并对拼写错误表示歉意!
查看完整描述

1 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

尝试这个:


answer = df.groupby(['id','id2']).transform(sum)['type'].str.count('C')

pd.concat([df,answer], axis=1)


  id id2  col1  type  type

0  e   z     0     A     2

1  e   z     1     C     2

2  e   z     2     C     2

3  e   y     3     C     1

4  e   y     4     A     1

5  f   x     4     A     0

6  f   x     3     B     0

7  f   x     4     B     0

8  g   w     5     C     1

9  g   w     6     B     1

您可以将 groupby 中的列增加到您想要的数量/数量。


查看完整回答
反对 回复 2023-09-12
  • 1 回答
  • 0 关注
  • 65 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信