2016-03-15 60 views
0

我想计算分组后的共同发生百分比。我无法确定这样做的最佳方法。我可以想出强制回答的方法,但这意味着大量的硬编码计算可能随着更多源数据的添加而破坏。必须有一个更优雅的方法,但我没有看到它。我很欣赏任何建议。Python熊猫群体后共同发生

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

目标:共现百分比分组后一数据列的表。例如:当A发生时,B在1月份的45%的时间内被发现。当A发生,C与发生时间的21%找到了第6周

样本数据(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。因此,对于B为50%时的整个数据集C,B分离为50%,其余为0%。但是,如果我GROUPBY月,则B隔离是为Jan 100%,和C时,B是二月

100%目前,我使用.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个事件)
  • 如何修改该按日期方便地将(周,月,季度等)?
  • 该地区如何成为一个分组?
  • 如何轻松地将其扩展到多个标准((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

您可以发布预期的输出吗? – MaxU

回答

0

我想你想要交叉表:

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

这会给你刚才的原始频率。然后,您可以将每个单元格除以总出现次数以获得联合概率。

编辑:我正在更彻底地阅读你的问题,我想你将需要做大量的数据争辩,而不仅仅是抛弃原始数据集中的pd.crosstabs。例如,你可能想要创建一个新的列df ['Week'],这个值只是基于df ['Date']的1- #Weeks值。

但这个问题有点老了,所以也许你已经知道了这一点。