调用用全局变量创建的Pandas数据帧()For For循环

时间:2014-09-04 17:33:08

标签: python-3.x pandas global-variables

我在python中迭代50个文件并将它们分别转储到pandas数据框中。然后,从每个数据帧,我基于原始数据帧中的特定字段中的值创建三个新数据帧。这三个新框架具有新名称,包括过滤它们的值。

它有效,耶!我得到了所有数据框!

问题是,我使用global()调用创建这些数据帧,并且我不知道如何在不明确地将每个单独的数据帧名称键入内核的情况下访问它们。

为什么我要这样做,你可能会问?

好吧,我想抓住以' cd'结尾的所有数据帧,并将它们追加(联合所有)到最终数据帧。我不想明确地打电话给所有50个人。我想循环遍历数据框列表来完成这项任务。

有关如何完成此操作或重新编写代码的任何建议吗?

对于使用iPython的这些更密集的流程我是新手,所以要改变一切。

    filelist = os.listdir()
    sum_list = ['CAKE', 'TWINKIES', 'DOUGHNUTS', 'CUPCAKES']
    for f in filelist:
        state = re.match('((\w+){2})\_', f)
        state_df = str(state.group(1)) + '_df'
        data = pd.read_csv(f, low_memory = False)
        df = pd.DataFrame(data)
        for x in sum_list:
            sdo = state_df + '_' + x.lower()
            globals()[sdo] = pd.DataFrame(df.loc[df['summary_level'] == x])

1 个答案:

答案 0 :(得分:1)

我认为更好的方法是创建自己的字典而不是求助于全局字典!只需创建自己的并附加到列表或列表字典? (取决于分类):

dfs = {}
for f in filelist:
    ...
    df = pd.read_csv(f)  # this returns a DataFrame
    for x in sum_list:
        ...
        dfs[sdo] = df[df.summary_level == x]  # again, this return a DataFrame

您可以使用默认字典,并将每个字典分配给子字典:

from collection import defaultdict
dfs = defaultdict({})
...
        dfs[x][sdo] = ...

即。 dfs['CAKE']将是所有CAKE DataFrame。