【发布时间】:2020-11-17 17:07:50
【问题描述】:
我想创建一个矩阵来确定一个活动跟随下一个活动的次数。 我有一个按时间顺序链接到 ID 的活动列表;
我尝试创建的输出将指定活动 X 跟随活动 Y 的次数,类似于以下内容;
为此我需要一个数据框,例如
df_probabilty matrix = [[0, 2, 0],[0, 1, 2],[0, 0, 0]]
这是一个测试问题的示例数据集:
df_Data1 = pd.DataFrame({"ID": [1, 1, 1, 1, 2, 2, 2], \
"Activity": ['Enter', 'Check', 'Check', 'Leave', 'Enter', 'Check', 'Leave']})
首先我在数据集中创建一个不同活动的列表
states = df_Data.Activity.values
set_states = set(states)
list_states = list(set_states)
接下来我创建一个列表列表
next_states = [0] * len(list_states)
next_states1 = [next_states] * len(list_states)
现在我想用下面的代码在activity_to的索引处增加activity_from对应的列表中的值;
for x in range(len(df_Data) - 1):
state_from = df_Data.Activity.iloc[x]
state_to = df_Data.Activity.iloc[x + 1]
if df_Data.ID.iloc[x] == df_Data.ID.iloc[x + 1]:
next_states1[list_states.index(state_from)][list_states.index(state_to)] += 1
但是,every 列表中第 n 个元素的值已使用此代码更新,所以我得到:
Enter Leave Check
Enter 0 2 3
Leave 0 2 3
Check 0 2 3
谁能解释我哪里出错了?如何只更新Activity_from对应的列表?
【问题讨论】:
-
next_states1 = [next_states] * len(list_states)创建一个列表引用列表,其中每个引用将指向内存中相同的底层列表 - 这意味着您实际上只有一个实际唯一且不同的列表。您尝试通过这些列表引用中的任何一个应用于基础列表的任何更改或突变都将反映在所有其他引用中,因为它们都指向内存中的相同基础列表。你真正想要做的是next_states1 = [next_states.copy() for _ in range(len(list_states))] -
谢谢,为我解决了这个问题!事后看来,不应该走捷径来创建我的列表列表