在Pandas数据框中计算每行的条件数量。

4

我有这个数据框:

   Char1  Char2  Char3
0      2      2      3
1      2      3      3
2      2      3      3
3      2      2      2

我需要创建三列(_1_2_3),每一行分别统计值为1、2和3的出现次数。
因此输出结果如下:
   Char1  Char2  Char3  _1  _2  _3
0      2      2      3   0   2   1
1      2      3      3   0   1   2
2      2      3      3   0   1   2
3      2      2      2   0   3   0

例如:
  • _1始终等于0,因为任何一行中都没有1
  • 对于列_2
    • 在第一行中等于2,因为第一行中有两个2
    • 在第二行中等于1,因为第二行中有一个2
    • 以此类推......

我该如何用Python实现这段代码?

我尝试了以下代码(仅针对_1):

df['_1'] = df[df.Char1 == 1].sum() + df[df.Char2 == 1].sum() + df[df.Char3 == 1].sum()

但我得到了“NaN”的结果。

DF构造函数:

df = pd.DataFrame({'Char1':[2,2,2,2], 'Char2':[2,3,3,2], 'Char3':[3,3,3,2]})
2个回答

4

您可以遍历[1,2,3],并在轴上使用eq来识别具有数字的单元格,并跨列使用sum以获取总数:

for num in [1,2,3]:
    df[f"_{num}"] = df[['Char1','Char2','Char3']].eq(num, axis=1).sum(axis=1)

输出:

   Char1  Char2  Char3  _1  _2  _3
0      2      2      3   0   2   1
1      2      3      3   0   1   2
2      2      3      3   0   1   2
3      2      2      2   0   3   0

这是一个非常有用的答案,很难找到 - 谢谢。我已经修改了这个方法,给我一个新列,计算每行中有多少列评估为真。df["TrueCount"] = df[['Char1','Char2','Char3']].eq(2, axis=1).sum(axis=1)。是否有一种方法可以使用多个条件来实现这种方法,而这些条件并不总是等于相同的东西。例如,计算Char1>0,Char2==2,Char3!=3的数量。 - DrWhat

3
我们可以通过将字典推导式传递给df.assign来简洁地完成此操作,其中字典键是列名,字典值是列系列数据。
df = df.assign(**{f'_{x}': df.eq(x, axis=1).sum(axis=1) for x in [1, 2, 3]})

#    Char1  Char2  Char3  _1  _2  _3
# 0      2      2      3   0   2   1
# 1      2      3      3   0   1   2
# 2      2      3      3   0   1   2
# 3      2      2      2   0   3   0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接