2016-12-28 94 views
1

考虑的3种类型的字典和3个空DataFrames蟒蛇大熊猫 - 编辑多个DataFrames用一个for循环

dict0={'actual': {'2013-02-20 13:30:00': 0.93}} 
dict1={'actual': {'2013-02-20 13:30:00': 0.85}} 
dict2={'actual': {'2013-02-20 13:30:00': 0.98}} 
dicts=[dict0, dict1, dict2] 

df0=pd.DataFrame() 
df1=pd.DataFrame() 
df2=pd.DataFrame() 
dfs=[df0, df1, df2] 

我想递归地修改循环中的3个Dataframes以下2所列出,使用以下行:

for df, dikt in zip(dfs, dicts): 
    df = df.from_dict(dikt, orient='columns', dtype=None) 

然而,试图检索环路外的DF的​​实例1时,它仍然是空

print (df0) 

将返回

Empty DataFrame 
Columns: [] 
Index: [] 

当从内部for循环打印DF,我们可以看到数据正确,虽然追加。

如何制作循环以便可以在循环外打印3个dfs的变化?

回答

2

在你的循环中,df只是一个临时值,而不是对相应列表元素的引用。如果您想在迭代列表时修改列表,则必须按索引引用列表。你可以用Python的枚举来做到这一点:

for i, (df, dikt) in enumerate(zip(dfs, dicts)): 
    dfs[i] = df.from_dict(dikt, orient='columns', dtype=None) 
0

我没有解释为什么是这样。然而一个解决方法是:

dict0={'actual': {'2013-02-20 13:30:00': 0.93}} 
dict1={'actual': {'2013-02-20 13:30:00': 0.85}} 
dict2={'actual': {'2013-02-20 13:30:00': 0.98}} 
dicts=[dict0, dict1, dict2] 

dfs = [] 

for dikt in dicts: 
    df = df.from_dict(dikt, orient='columns', dtype=None) 
    dfs.append(df) 

现在

dfs[0] 

回报

     actual 
2013-02-20 13:30:00 0.93 
+0

离开这个在这里,但@Blackecho好得多 – bouletta

1

你需要保持的参考DF对象,所以你可以尝试:

for idx, dikt in enumerate(dicts): 
    dfs[idx] = dfs[idx].from_dict(dikt, orient='columns', dtype=None) 
2

这将完成地点!!!
3惊呼

一个衬垫

[dfs[i].set_value(r, c, v) 
for i, dn in enumerate(dicts) 
for r, dr in dn.items() 
for c, v in dr.items()]; 

起来更直观

for d, df in zip(dicts, dfs): 
    temp = pd.DataFrame(d).stack() 
    for (r, c), v in temp.iteritems(): 
     df.set_value(r, c, v) 

df0 

        actual 
2013-02-20 13:30:00 0.93 

等量替代
没有pd.DataFrame建设

for i, dn in enumerate(dicts): 
    for r, dr in dn.items(): 
     for c, v in dr.items(): 
      dfs[i].set_value(r, c, v) 

这是为什么不同?
到目前为止,所有其他答案都会将新数据框重新分配到数据框列表中的必需位置。他们打破了那里的数据框。原始数据框保留为空,而新的非空列表保留在列表中。

该解决方案就地编辑数据帧,确保原始数据框更新为新信息。

每OP:

然而,试图检索环路外的DF的​​实例1时,它仍然是空


时机
这也相当快

enter image description here


设置

dict0={'actual': {'2013-02-20 13:30:00': 0.93}} 
dict1={'actual': {'2013-02-20 13:30:00': 0.85}} 
dict2={'actual': {'2013-02-20 13:30:00': 0.98}} 
dicts=[dict0, dict1, dict2] 

df0=pd.DataFrame() 
df1=pd.DataFrame() 
df2=pd.DataFrame() 
dfs=[df0, df1, df2] 
+0

你的三个for循环解决不必要的解构现有类型的字典。 – 2016-12-29 00:24:07

+0

@fuzzyhedge否,它不,我需要得到这些键和值,以便使用'set_value'。使用'set_value'或'pd.DataFrame.at'或'pd.DataFrame.loc'是我能想到的编辑数据帧的唯一选项。为了得到那些行,列,值组合,我不得不迭代。我本可以使用一个数据帧构造函数来遍历它,但这是不必要的。 – piRSquared

0

一行。

>>>df_list = [df.from_dict(dikt, orient='columns', dtype=None) for (df, dikt) in zip(dfs, dicts)] 

>>>df_list 
[      actual 
2013-02-20 13:30:00 0.93, 
         actual 
2013-02-20 13:30:00 0.85, 
         actual 
2013-02-20 13:30:00 0.98] 

>>>df_list[0] 
        actual 
2013-02-20 13:30:00 0.93