将多个CSV文件读取到DataFrames并在其原始文件名后命名

时间:2014-09-25 08:58:14

标签: python pandas

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

  1. 使用相同的顺序将文件分配给数据框名称: 1.csv -> data1, 2.csv ->data2
  2. 以相同方式分配列: delta1 = data1["C"] - data1["A"]
  3. 我想把它放到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) 
    

    但在for循环中肯定是错误的语法,有更好的方法对它进行编码,这样在循环之后,我可以得到:

    data1, data2, data3 ...

    与对应:

    delta1, delta2, delta3 ...

2 个答案:

答案 0 :(得分:1)

您可以使用本机pandas功能完成所有操作,而不是使用dicts。

首先将您的csvs读入列表:

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操作访问这些增量,如下所示:

df.loc[2,"delta"]

此方法更加原生于pandas,并且可以使用更大的数据集进行更好的扩展。

答案 1 :(得分:0)

以下是您想要使用词典的实现(例如@EdChum在评论中的建议):

data = {}
delta = {}

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(data[1][data[1].delta[1] > 0].column) & set(data[2][data[2].delta[2] == 0].column) 
set(data[2][data[2].delta[2] > 0].column) & set(data[3][data[3].delta[3] == 0].column) 

我真的建议使用如上所述的词典。但是,如果你真的真的坚持像你想要的那样动态分配变量,你可以做以下非常危险而不推荐的事情:

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

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)