# 生成指定列名行索引的空表格
# 修改字典内不同表格的值
import pandas as pd
list1 = ['列1', '列2', '列3'] # 列名列表
list2 = ['行1', '行2', '行3'] # 行索引列表
df = pd.DataFrame(columns=list1, index=list2)
# 1
dic = {key: df for key in ["key1", "key2", "key3"]}
# 会联动修改所有的键值表格
dic["key1"].iloc[0] = range(3)
# 2
dic = {key: value for key, value in zip(["key1", "key2", "key3"], [df]*3)}
# 会联动修改所有的键值表格
dic["key1"].iloc[0] = range(3)
# 3
df1, df2, df3 = [pd.DataFrame(columns=list1, index=list2)] * 3
dic = {key: value for key, value in zip(["key1", "key2", "key3"], [df1, df2, df3])}
# 会联动修改所有的键值表格
dic["key1"].iloc[0] = range(3)
# 4
df1 = pd.DataFrame(columns=list1, index=list2)
df2 = pd.DataFrame(columns=list1, index=list2)
df3 = pd.DataFrame(columns=list1, index=list2)
dic = {key: value for key, value in zip(["key1", "key2", "key3"], [df1, df2, df3])}
dic["key1"].iloc[0] = range(3)
# 只修改指定键名的键值表格
print(dic)
# 总结 避免同指向
这段代码的主要目标是创建一个字典,其中的键值是Pandas DataFrame对象。这些DataFrame对象有相同的列名和行索引,但是它们的值可能会有所不同。
首先,你创建了一个空的DataFrame df
,它有指定的列名(list1
)和行索引(list2
)。
然后,你尝试了四种不同的方法来创建字典:
- 方法一:你创建了一个字典
dic
,其中每个键的值都是同一个DataFramedf
。当你修改其中一个键的值时(例如dic["key1"].iloc[0] = range(3)
),所有的键值都会被修改,因为它们都指向同一个DataFrame对象。 - 方法二:你创建了一个新的字典
dic
,其中每个键的值都是df
的副本。然而,由于你使用了列表乘法([df]*3
),这些副本实际上都是指向同一个对象的引用。因此,当你修改其中一个键的值时,所有的键值都会被修改。 - 方法三:你创建了三个新的DataFrame对象(
df1
,df2
,df3
),它们都是通过列表乘法从df
创建的。然后,你创建了一个新的字典dic
,其中每个键的值都是这些新的DataFrame对象。然而,由于这些新的DataFrame对象都是通过列表乘法创建的,它们实际上都是指向同一个对象的引用。因此,当你修改其中一个键的值时,所有的键值都会被修改。 - 方法四:你分别创建了三个新的DataFrame对象(
df1
,df2
,df3
)。然后,你创建了一个新的字典dic
,其中每个键的值都是这些新的DataFrame对象。由于这些新的DataFrame对象是独立创建的,它们不会指向同一个对象。因此,当你修改其中一个键的值时,其他的键值不会被修改。
总的来说,如果你想要在字典中存储多个独立的DataFrame对象,你应该避免使用列表乘法来创建这些对象,因为这会导致所有的对象都指向同一个引用。相反,你应该分别创建每个对象,以确保它们是独立的。希望这个解释对你有所帮助!
标签:表格,df,创建,列名,DataFrame,dic,键值,key1,字典 From: https://blog.51cto.com/u_16055028/9429271