在 groupby 之后 Python Pandas 共现

Posted

技术标签:

【中文标题】在 groupby 之后 Python Pandas 共现【英文标题】:Python Pandas co-occurrence after groupby 【发布时间】:2016-03-15 15:34:08 【问题描述】:

我想计算分组后的共现百分比。我无法确定这样做的最佳方法。我可以想办法强行回答,但这意味着大量的硬编码计算可能会随着更多源数据的添加而中断。一定有更优雅的方法,但我没有看到。我很感激任何建议。

(可能有点类似于Python Pandas check if a value occurs more then once in the same day)

目标:分组后数据列的共现百分比表。 例如:当 A 发生时,在 1 月份发现 B 的概率为 45%。当 A 发生时,在第 6 周,C 的出现率为 21%。

样本数据(df):

Date        ID      Region  Event
1/01/2016   1001    S       C
1/01/2016   1001    S       D
1/01/2016   1001    N       E
1/01/2016   1002    E       D
1/02/2016   1003    E       A
1/04/2016   1005    N       B
1/04/2016   1005    N       B
1/04/2016   1005    N       B
1/04/2016   1006    N       A
1/04/2016   1006    N       F
2/12/2016   1008    E       C
2/12/2016   1008    E       B

要计算百分比,我需要找到发生在同一 ID 中的事件。因此,对于整个数据集 C,当 B 为 50% 时,B 隔离为 50%,所有其他为 0%。但是,如果我按月份分组,则 B 隔离为 100% 为 1 月,C 为 B 为 100% 为 2 月。

目前,我有代码使用 .isin 和 .drop_duplicates 来查找和减少列表:

b_ids = df[df.Event == 'B'].ID.drop_duplicates()
x = len(b_ids)
c_when_b = df[(df.ID.isin(b_ids)) & (df.Event == 'C')].ID.drop_duplicates()
y = len(c_when_b)
pct_cb = float(x)/y

问题:

如何将其扩展到事件的所有二进制组合(真实数据有 25 个事件) 如何修改它以便按日期(周、月、季度等)轻松分组? Region 怎么可能也是一个分组? 如何轻松将其扩展到多个标准( (A | B) & (C | D) )? 有什么简单的东西我完全错过了吗? 如果不清楚,请告诉我。提前致谢。

编辑: 预期输出将是给定时间分组的每个事件的多列系列进行绘图(忽略这些实际数字):

EVENT A
      A       B     C     ...
1     96.19   1.23  2.22
2     96.23   1.56  1.12
3     95.24   2.58  3.02
4     78.98   20.31 1.11
...   ....    ...   ...

EVENT B
      A       B      C    ...
1     96.19   1.23   3.33
2     96.23   1.56   1.08
3     95.24   2.58   1.78
4     78.98   20.31  5.12
...   ....    ...    ...

【问题讨论】:

你能发布一个预期的输出吗? 【参考方案1】:

我想你想要交叉表:

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.crosstab.html

这将为您提供原始频率。然后,您可以将每个单元格除以出现的总数以获得联合概率。

编辑:我正在更彻底地阅读您的问题,并且我认为您将需要做很多数据争论,而不仅仅是在原始数据集上扔 pd.crosstabs。例如,您可能想要创建一个新列 df['Week'],它只是一个基于 df['Date'] 的值 1-#ofWeeks。

但是这个问题有点老了,所以也许你已经想通了。

【讨论】:

以上是关于在 groupby 之后 Python Pandas 共现的主要内容,如果未能解决你的问题,请参考以下文章

panda groupby ID,并计算相对于坐标中心的半径

panda的多索引的好处?

python 用groupby之后生成新的数据框

在 groupby 之后 Python Pandas 共现

在python pandas中groupby之后从列中填充缺失的行

Python pandas - 在 groupby 之后过滤行