pandas Python 3在循环中创建多个DF

lyr7nygr  于 2023-03-28  发布在  Python
关注(0)|答案(1)|浏览(235)

我想从多个CSV文件中创建多个DF。在本例中,我有3个CSV文件,我想循环遍历每个文件并为每个文件创建一个新的DF。每个文件名都附加一个数字1 - 3。我希望每个DF都附加一个相应的1 - 3。这将在未来有所不同。
我用我想要的DF名称创建了一个字典,但是当我试图从文件中创建DF时,我的代码最终将DF加载到字典中,而不是为我创建单独的DF。
我是这么试的:

district =  'districtname'

if (district == 'districtname'):
    # setup df names in a dictionary
    dfs = {} # create a dictionary
    i = 1
    while i <= 3:  
        dfs[i] = "dfdistrictname" + str(i)
        i = i + 1
    print(dfs)   
    
    # create the DFs
    n = 1
    while n <= 3:
        filename = 'oppdetail_oppview_' + year + '_' + district + str(n) + '.csv'
        print(filename)
        print(dfs[n])
        dfs[n] = pd.read_csv(filename)
        n = n + 1

所有的输出都是我所期望的,只是这一行:

dfs[n] = pd.read_csv(filename).

在字典结构内部创建DF,而不是单独的DF对象。

{1: 'dfdistrictname1', 2: 'dfdistrictname2', 3: 'dfdistrictname3'}
oppdetail_oppview_2023_districtname1.csv
dfdistrictname1
oppdetail_oppview_2023_districtname2.csv
dfdistrictname2
oppdetail_oppview_2023_districtname3.csv
dfdistrictname3

我知道python正在做我要求它做的事情。我的问题是我如何获得单独的DFs?

zzwlnbp8

zzwlnbp81#

如果我对问题的理解是正确的(我可能不正确)
您有未知数量的.csv文件要全局加载到各个 Dataframe 中。
我建议如下:
1.首先,使用pathlib.Path.glob扫描与您的名称结构匹配的.csv文件(以oppdetail_oppview_开始,名称中包含district,以.csv结束)。
下面的例子在脚本的工作目录(.)中查找文件。这可能与您的系统不同。
1.使用enumerate对结果进行迭代,以便同时获得可迭代结果中的索引和Path对象本身
1.使用索引为将存储每个 Dataframe 的变量计算合适的名称。
1.加载dataframe并将其注入到globals()符号中,使它们成为某种全局变量。
这最后一部分通常被认为是一个不太好的实践,因为您将基本上以编程方式声明一个全局变量,这意味着你所有的链接都会被弄糊涂。嗯...阅读代码的人也会被弄糊涂。想象一下有人在阅读你的代码,突然看到变量dfdistrictname1被使用。现在他们试图查看该变量在哪里被声明/初始化/younameit...他们找不到的
此外,在将名称注入globals()之后,很难知道您是否声明了2个或5个或10个dfdistrictnameX变量。
有了这些成分,你可以尝试以下方法:

from pathlib import Path
import pandas as pd

for i, path in enumerate(Path('.').glob('oppdetail_oppview_*district*.csv')):
    print(f"Found .csv in: {path}")
    name = f"dfdistrictname{i + 1}"
    print(f"Gonna name it: {name}")
    df = pd.read_csv(path)
    globals()[name] = df  # Inject in the global variables

print(f"Printing dataframe dfdistrictname1:\n {dfdistrictname1}")

相关问题