Pandas DataFrame 错误地填写了一列——奇怪的行为

Pandas DataFrame filling in a column incorrectly -- Strange behavior

我在 printdf.at 的 for 循环中得到了不同的结果。这能解释一下吗?

import pandas as pd
data = [['A', []], ['B', []], ['C', []], ['D', []]]
df = pd.DataFrame(data, columns = ['Act', 'PreviousActs'])

actssofar = []

for i, row in df.iterrows():
 actssofar.append(row['Act'])
 print (i, actssofar)
 df.at[i,'PreviousActs'] = actssofar

现在,for 循环中 print 函数的输出是这样的:

0 ['A']
1 ['A', 'B']
2 ['A', 'B', 'C']
3 ['A', 'B', 'C', 'D']

但是dataframe的输出是这样的:

Acts PreviousActs
A A, B, C, D
B A, B, C, D
C A, B, C, D
D A, B, C, D

从逻辑上讲,它不应该显示与打印函数相同的逐步附加行为,因为我们正在用相同的值填充数据帧吗?

您需要先复制列表,然后再将其放入 DataFrame 中。它是一个可变对象,您当前存储在 DataFrame 中的是对原始列表的 reference,而不是它的副本。 PreviousActs 列中的每个元素都是同一个列表。

如果我理解正确,问题是,当循环结束时,您的数据帧包含 ['A', 'B', 'C', 'D'] for all rows.This 发生,因为您将列表作为“参考”传递,这意味着所有行存储相同的列表。每次将它分配给数据框时,您都应该添加一个 list() 调用来创建一个新列表。

import pandas as pd
data = [['A', []], ['B', []], ['C', []], ['D', []]]
df = pd.DataFrame(data, columns = ['Act', 'PreviousActs'])

actssofar = []

for i, row in df.iterrows():
 actssofar.append(row['Act'])
 print (i, actssofar)
 df.at[i,'PreviousActs'] = list(actssofar)

更新后的答案利用了可变性并且内存效率更高,因为它只创建一个列表。

import pandas as pd
data = [['A', []], ['B', []], ['C', []], ['D', []]]
df = pd.DataFrame(data, columns = ['Act', 'PreviousActs'])

actssofar = []

for i, row in df.iterrows():
 actssofar.append(row['Act'])
 print (i, actssofar)
 df.at[i,'PreviousActs'] = actssofar[:i+1]