【问题标题】:Calling Pandas Data Frames Created with globals() Inside For Loop在 For 循环中调用使用 globals() 创建的 Pandas 数据框
【发布时间】:2014-10-29 13:39:36
【问题描述】:

我在 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])

【问题讨论】:

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


    【解决方案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 数据帧。

    【讨论】:

    • 嘿,谢谢!最终做了你建议之外的事情,但你让我以不同的方式思考这个问题。
    • @Audrey 太棒了!希望你喜欢熊猫!
    猜你喜欢
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    相关资源
    最近更新 更多