我有几个结构相同的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)
但在for循环中肯定是错误的语法,有更好的方法对它进行编码,这样在循环之后,我可以得到:
data1, data2, data3
...
与对应:
delta1, delta2, delta3
...
答案 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)