Pandas DataFrame 错误地填写了一列——奇怪的行为
Pandas DataFrame filling in a column incorrectly -- Strange behavior
我在 print
和 df.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]
我在 print
和 df.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]