蟒蛇大熊猫 - 编辑多个DataFrames用一个for循环
考虑的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的变化?
在你的循环中,df
只是一个临时值,而不是对相应列表元素的引用。如果您想在迭代列表时修改列表,则必须按索引引用列表。你可以用Python的枚举来做到这一点:
for i, (df, dikt) in enumerate(zip(dfs, dicts)):
dfs[i] = df.from_dict(dikt, orient='columns', dtype=None)
我没有解释为什么是这样。然而一个解决方法是:
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
你需要保持的参考DF对象,所以你可以尝试:
for idx, dikt in enumerate(dicts):
dfs[idx] = dfs[idx].from_dict(dikt, orient='columns', dtype=None)
这将完成地点!!!
请注 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时,它仍然是空
时机
这也相当快
设置
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]
你的三个for循环解决不必要的解构现有类型的字典。 – 2016-12-29 00:24:07
@fuzzyhedge否,它不,我需要得到这些键和值,以便使用'set_value'。使用'set_value'或'pd.DataFrame.at'或'pd.DataFrame.loc'是我能想到的编辑数据帧的唯一选项。为了得到那些行,列,值组合,我不得不迭代。我本可以使用一个数据帧构造函数来遍历它,但这是不必要的。 – piRSquared
一行。
>>>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
离开这个在这里,但@Blackecho好得多 – bouletta