【问题标题】:Pandas: frequency of an element in two groups of columns熊猫:两组列中元素的频率
【发布时间】:2013-05-09 18:31:14
【问题描述】:

我有一个 DataFrame data 布局如下:

Observation     A_1    A_2    A_3    B_1    B_2    B_3
Obs1            yes    no     yes    no     no     no
Obs2            no     no     no     yes    yes    yes
Obs3            yes    yes    yes    yes    yes    yes

目标:计算所有标记为“是”的观察结果的频率:

  • 仅在“A”样本中
  • 仅在“B”样本中
  • 在两组中

编辑:这意味着对于前两个计数,我需要排除 A 组和 B 组包含“是”的观察结果(见第三行)。

我考虑过使用groupby

grouper = data.groupby(lambda x: x.split("_")[0], axis=1)
grouped = grouper.agg(lambda x: sum(x == "yes"))

但是我的计数除以行,这不是我想要的。

这里最好的行动是什么?

编辑:根据要求,有关输出的更多信息。我想要类似的东西

Frequency of valid [meaning "yes"] observations in group A: X
Frequency of valid observations in group "B": Y
Frequency for all valid observations: Z

其中 X、Y 和 Z 是返回的计数。

我不关心个人观察的这个特定输出。我对所有这些值都感兴趣。

【问题讨论】:

  • 你能包括你想要的输出吗?我不完全确定您的预期结果是什么。

标签: python group-by pandas


【解决方案1】:
In [129]: a = ['A_1', 'A_2', 'A_3']

In [130]: b = ['B_1', 'B_2', 'B_3']

In [131]: ina = (df[a] == 'yes').any(axis=1)

In [132]: inb = (df[b] == 'yes').any(axis=1)

In [133]: ina & ~inb
Out[133]:
Observation
Obs1            True
Obs2           False
Obs3           False
dtype: bool

In [134]: ~ina & inb
Out[134]:
Observation
Obs1           False
Obs2            True
Obs3           False
dtype: bool

In [135]: ina & inb
Out[135]:
Observation
Obs1           False
Obs2           False
Obs3            True
dtype: bool

可以使用 value_counts 进行计数:(ina & inb).value_counts()[True]

【讨论】:

  • 前两行还将包括“A”和“B”在其组中都有“yes”的组。我在帖子中添加了解释以使这一点更清楚。无论如何,这很有用。
【解决方案2】:

我仍然不清楚您是否希望 yes no yes no no no 计为 1 或 2。我需要的最接近的东西看起来像这样:

>>> df
             A_1  A_2  A_3  B_1  B_2  B_3
Observation                              
Obs1         yes   no  yes   no   no   no
Obs2          no   no   no  yes  yes  yes
Obs3         yes  yes  yes  yes  yes  yes
Obs4         yes  yes   no   no   no   no
>>> y = (df == "yes").groupby(lambda x: x.split("_")[0], axis=1).sum()
>>> y
             A  B
Observation      
Obs1         2  0
Obs2         0  3
Obs3         3  3
Obs4         2  0
>>> which = y.apply(lambda x: tuple(x.index[x > 0]), axis=1)
>>> which
Observation
Obs1             (A,)
Obs2             (B,)
Obs3           (A, B)
Obs4             (A,)
dtype: object
>>> y.groupby(which).sum()
        A  B
(A,)    4  0
(A, B)  3  3
(B,)    0  3

或者干脆

>>> which.value_counts()
(A,)      2
(A, B)    1
(B,)      1
dtype: int64

取决于你的目标。

【讨论】:

    猜你喜欢
    • 2020-07-03
    • 2022-09-27
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 2022-08-15
    • 2020-12-29
    • 2022-11-02
    • 1970-01-01
    相关资源
    最近更新 更多