我一直在尝试创建数据框字典,以便存储来自不同文件的数据。我在下面的循环中创建了一个数据框,我希望将它们聚合在一起以使每个数据框都包含在字典中。我必须在约会之后加入他们。
d = {}
for num in range(3,14):
nodeName = "rgs" + str(num).zfill(2) #The key should be the nodeName
# Bunch of stuff to get the data ...
# Fill dataframe
data = {'date':date_list, 'users':users_list}
df = pd.DataFrame(data)
df = df.convert_objects(convert_numeric=True)
df = df.dropna(subset=['users'])
df['users'] = df['users'].astype(int)
d = {nodeName:df}
print d
我遇到的问题是,如果我将字典打印出循环,我只有一个项目,最后一个。
{'rgs13': date users
0 2016-01-18 1
1 2016-01-19 1
2 2016-01-20 1
3 2016-01-21 1
4 2016-01-22 1
5 2016-01-23 1
6 2016-01-24 0
但是我可以清楚地看到我可以在循环中生成所有数据帧而没有问题。如何让字典保留所有的df?我究竟做错了什么?
感谢您的帮助。
答案 0 :(得分:0)
而不是d = {nodeName:df}
使用
d[nodeName] = df
因为这会将键/值对添加到d
,而d = {nodeName:df}
将 d
重新分配给新的dict(只有一个键/值对) 。在循环中执行该操作会使所有先前的键/值对死亡。
你可能会发现Ned Batchelder的Facts and myths about Python names and values是一本有用的读物。它将为您提供思考变量名称和值之间关系的正确心智模型,并帮助您查看哪些语句修改值(例如d[nodeName] = df
)与重新分配变量名称(例如d = {nodeName:df}
)。
答案 1 :(得分:0)
这是因为最终你要重新定义d
。
你想要的是这个:
d = {}
for num in range(3,14):
nodeName = "rgs" + str(num).zfill(2) #The key should be the nodeName
# Bunch of stuff to get the data ...
# Fill dataframe
data = {'date':date_list, 'users':users_list}
df = pd.DataFrame(data)
df = df.convert_objects(convert_numeric=True)
df = df.dropna(subset=['users'])
df['users'] = df['users'].astype(int)
d[nodeName] = df
print d