【发布时间】:2017-09-28 03:24:00
【问题描述】:
我想根据另一个表中的值(和计数)构建一个二维表。我设法使用 Excel 成功地对此进行了原型设计,但是我被两个概念困住了:
1. Emulating Excel COUNTIF() on pandas
2. Dynamically build a new dataframe
注意:COUNTIF() 将范围和条件作为参数。例如,如果我有一个颜色列表,并且我想知道“橙色”出现在下面列表中的次数:
A
Red
Orange
Blue
Orange
Black
,那么我会简单地使用以下公式:
COUNTIF(A1:A5, "Orange")
这应该返回 2。
当然 COUNTIF() 函数可以变得更复杂,例如这种形式的连接条件示例 COUNTIF(range1,criteria1,range2,criteria2...) 可以解释为 AND 条件。例如,如果我想在类似于以下的列表中计算 35 岁以上的女性:
A B
Female 19
Female 40
Male 45
,那么我会简单地使用以下公式:
COUNTIF(A1:A3, "Female", B1:B3, ">35"
这应该返回 1。
回到我的用例。这是源表:
Product No Opening Date Closing Date Opening Month Closing Month
0 1 2016-01-01 2016-06-30 2016-01-31 2016-06-30
1 2 2016-01-01 2016-04-30 2016-01-31 2016-04-30
2 3 2016-02-01 2016-06-30 2016-02-29 2016-06-30
3 4 2016-02-01 2016-05-31 2016-02-29 2016-05-31
4 5 2016-02-01 2099-12-31 2016-02-29 2099-12-31
5 6 2016-01-01 2099-12-31 2016-01-31 2016-10-31
6 7 2016-06-01 2016-07-31 2016-06-30 2016-07-31
7 8 2016-06-01 2016-11-30 2016-06-30 2016-11-30
8 9 2016-06-01 2016-07-31 2016-06-30 2016-07-31
9 10 2016-06-01 2099-12-31 2016-06-30 2099-12-31
这是我想要实现的二维矩阵:
2016-01-31 2016-02-29 2016-03-31 2016-04-30 2016-05-31 \
2016-01-31 3 3 3 2 2
2016-02-29 3 3 3 3 2
2016-03-31 0 0 0 0 0
2016-04-30 0 0 0 0 0
2016-05-31 0 0 0 0 0
2016-06-30 4 4 4 4 4
2016-07-31 0 0 0 0 0
2016-08-31 0 0 0 0 0
2016-09-30 0 0 0 0 0
2016-10-31 0 0 0 0 0
2016-11-30 0 0 0 0 0
2016-12-31 0 0 0 0 0
2016-06-30 2016-07-31 2016-08-31 2016-09-30 2016-10-31 \
2016-01-31 1 1 1 1 0
2016-02-29 1 1 1 1 1
2016-03-31 0 0 0 0 0
2016-04-30 0 0 0 0 0
2016-05-31 0 0 0 0 0
2016-06-30 4 2 2 2 2
2016-07-31 0 0 0 0 0
2016-08-31 0 0 0 0 0
2016-09-30 0 0 0 0 0
2016-10-31 0 0 0 0 0
2016-11-30 0 0 0 0 0
2016-12-31 0 0 0 0 0
2016-11-30 2016-12-31
2016-01-31 0 0
2016-02-29 1 1
2016-03-31 0 0
2016-04-30 0 0
2016-05-31 0 0
2016-06-30 1 1
2016-07-31 0 0
2016-08-31 0 0
2016-09-30 0 0
2016-10-31 0 0
2016-11-30 0 0
2016-12-31 0 0
基本上我想建立一个产品随时间生存的矩阵。纵轴代表新产品的起源,而横轴衡量这些帐户中有多少随着时间的推移持续存在。
例如,如果在 1 月份推出了 10 种产品,则 1 月与 1 月的数字应为 10。如果这 10 种产品中的 1 种在 2 月关闭,则 1 月与 2 月的数字应为 9。如果所有剩余产品都到六月关闭,那么一月与六月、七月、八月等的行应该是 0。
2月、3月、4月等的产品开发不会影响1月的行。
我设法使用以下 excel 公式构建了二维矩阵:
=COUNTIF(Accounts!$D$2:$D$11,Main!$A2)-COUNTIFS(Accounts!$D$2:$D$11,Main!$A2, Accounts!$E$2:$E$11,"<="&Main!B$1)
(这将填充第一个单元格)
我最初的策略是构建一个多维列表并使用多个 for 循环来填充它们,但我不确定 Pandas 中是否有更简单(或更推荐的方式)。
【问题讨论】: