通过遍历数据帧来填充嵌套字典,但没有产生期望的结果



我有一个带有双时间戳数据(生效日期和终止日期)的数据框,我想为数据中表示的每个实体生成一个嵌套字典(并最终生成一个新数据框),用于统计数据随时间的活动实例。例如,如果一个字段在1980年变得活跃,我希望1980年键中该公司键的值增加1。如果一个字段终止于1992,我希望1992键中该公司键的值减少1。

下面是一个数据示例:

ID  CO_Num  CO_Name      Termination_Date   Effective_Date
106072  84028   COMPANY A    7/1/04         4/9/69
106084  84028   COMPANY A    12/1/85            8/20/69
106094  84028   COMPANY A    12/1/70            10/3/69
106115  84028   COMPANY B    12/1/85            1/7/70
106133  91108   COMPANY B    2/4/86         3/6/70
106133  91108   COMPANY C    NaT                3/6/91
106133  91108   COMPANY C    NaT                3/6/91

我创建了一个嵌套字典,将年份作为顶部键,将公司/实例字典作为值,将所有公司值设置为0。例如

nest_dict = {2000: {'COMPANY A': 0, 'COMPANY B': 0}, 2001: {'COMPANY A': 0, 'COMPANY B': 0}}

然后,我尝试了几乎所有我能想到的方法来迭代数据框和/或字典以获得我想要的输出。这是我当前的迭代代码。

for key, value in nest_dict.items():
for data in df.values:
if data[4].year == key:
value[data[2]] += 1
if data[3].year == key:
value[data[2]] -= 1

当我将输出放入数据帧时,它看起来像这样:

| 1969     | 1970     | 1971     |
--------- | -------- | -------- | -------- |
Company A | 0        | 0        | 0        |
Company B | 0        | 0        | 0        |
Company C | 2        | 2        | 2        |

我想看到的是这样的:

| 1969     | 1970     | 1971     |
--------- | -------- | -------- | -------- |
Company A | 3        | 2        | 2        |
Company B | 0        | 2        | 2        |
Company C | 0        | 0        | 0        |

在本例中,每列是每个公司的活动实例的运行统计。相反,我得到的是每个公司都相同的终端值。

我觉得我在这里错过了一些非常简单的东西。如有任何帮助,不胜感激。

<代码>

我明白了。我遇到的第一个问题是,我没有把公司每年的子词典都复印出来。有关这方面的更多信息,请参阅这篇文章

我的第二个问题是弄清楚如何利用我以前的迭代输出值

1969    1970    1971    1972    1973    1974    1975    1976    1977    1978    1979    1980    1981    1982    1983    1984    1985    1986    1987    1988    1989    1990    1991    1992    1993    1994    1995    1996
Company                                                                                                                                                                                                                     
COMPANY A   3   9   9   9   9   9   9   9   9   9   9   9   9   9   9   9   3   3   3   3   3   3   3   3   3   3   3   3   3   3   1   1   1   1   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
COMPANY B   0   1   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
COMPANY C   0   1   1   3   4   4   4   4   4   4   5   6   12  17  21  21  22  21  20  20  20  20  20  20  20  18  18  16  14  1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
COMPANY D   0   3   3   3   3   3   3   3   3   3   3   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
COMPANY E   0   0   1   2   2   4   4   7   11  16  17  19  25  25  17  17  17  17  10  10  10  10  10  10  10  10  10  10  10  1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

数值索引从数据帧行调用"有效日期"one_answers"终止日期"值,如果它读起来有点乱,请道歉。

这给了我想要的结果。

PP_8如果有人对如何做得更好/更有效有意见或建议,我将不胜感激。

最新更新