Python 将多个CSV文件读取到数据帧,并以其原始文件名命名

Python 将多个CSV文件读取到数据帧,并以其原始文件名命名,python,pandas,Python,Pandas,我有几个相同结构的csv文件,我想要 按相同顺序将文件分配给数据帧名称: 1.csv->data1,2.csv->data2 并以相同的方式指定列: delta1=data1[“C”]-data1[“A”] 我想将其放入for循环,如下所示: for i in range (1, 22): data%i = pd.read_csv('CSV/' + str(i) + '.csv') delta%i = data%i["C"] - data%i["A"] # And I want

我有几个相同结构的csv文件,我想要

  • 按相同顺序将文件分配给数据帧名称:
    1.csv->data1,2.csv->data2
  • 并以相同的方式指定列:
    delta1=data1[“C”]-data1[“A”]
  • 我想将其放入for循环,如下所示:

    for i in range (1, 22):
        data%i = pd.read_csv('CSV/' + str(i) + '.csv')
        delta%i = data%i["C"] - data%i["A"]
    
    # And I want to compare the 2 series from dataframe.column to find a set intersection
    set(data1[data1.delta1 > 0].column) & set(data2[data2.delta2 == 0].column) 
    set(data2[data2.delta2 > 0].column) & set(data3[data3.delta3 == 0].column) 
    
    df.loc[2,"delta"]
    
    但是for循环中的语法肯定是错误的,有没有更好的方法对其进行编码,以便在循环之后,我可以得到:

    data1、data2、data3

    与相应的:


    delta1、delta2、delta3

    下面是一个使用字典实现您想要的功能的实现(如@EdChum在注释中所建议的):

    我真的建议使用上面这样的措辞。但是,如果您真的坚持动态分配变量,就像您想在问题中做的那样,您可以做以下非常危险且不推荐的事情:

    您可以使用以下方法动态分配变量:

    globals()[variable_name]=variable_value
    
    再说一次,你真的不应该那样做。也没有理由这样做,但现在,这里是对代码的修改,它确实符合您的要求:

    for i in range (1, 22):
        datai = "data"+str(i)
        deltai = "delta"+str(i)
        globals()[datai] = pd.read_csv('CSV/' + str(i) + '.csv')
        globals()[deltai] = globals()[datai]["C"] - globals()[datai]["A"]
    
    # And I want to compare the 2 series from dataframe.column to find a set intersection
    set(data1[data1.delta1 > 0].column) & set(data2[data2.delta2 == 0].column) 
    set(data2[data2.delta2 > 0].column) & set(data3[data3.delta3 == 0].column)
    

    与dict相反,您可以使用本机函数完成所有操作

    首先将您的CSV读入列表:

    df_list = []
    for i in range(1, 22):
        df_list.append(pd.read_csv("{i}.csv".format(i)))
    
    现在让我们看看他们:

    df = pd.concat(df_list, keys=range(1,22))
    
    现在,您的数据帧
    df
    将使用您加载的文件的键进行索引

    例如,执行
    df.loc[1]
    将从文件
    1.csv

    现在,您可以通过单个操作设置增量:

    df["delta"] = df["C"] - df["A"]
    
    您也可以使用
    DataFrame.loc
    操作访问这些增量,如下所示:

    for i in range (1, 22):
        data%i = pd.read_csv('CSV/' + str(i) + '.csv')
        delta%i = data%i["C"] - data%i["A"]
    
    # And I want to compare the 2 series from dataframe.column to find a set intersection
    set(data1[data1.delta1 > 0].column) & set(data2[data2.delta2 == 0].column) 
    set(data2[data2.delta2 > 0].column) & set(data3[data3.delta3 == 0].column) 
    
    df.loc[2,"delta"]
    

    此方法更适合
    pandas
    ,可以更好地扩展到更大的数据集。

    对不起,您只是想问如何添加新列?如果这样做:
    data['delta']=data['C']-data['A']
    我的意思是,在使用for循环读取1.csv 2.csv时,如何将df名称指定为data1 data2 data3等,这是可能的吗?名称有点不相关,您可以将结果df附加到列表或dict中,名称只是对对象的引用,为什么这很重要。从概念上讲,你的问题对我来说没有意义。你需要更好地解释,并将其编辑到你的问题中。哦,我的目的是做以下工作:data1[data1.delta1>0]。列&data2[data2.delta2=0].column和我需要对不同的DataFrame执行相同的设置操作。将delta%I作为列名的df有点奇怪,为什么不只是delta?此外,如果您愿意使用delta1、delta2列,也可以只使用一个df。。。。在不丢失身份的情况下对整个df进行计算