For循环基于指定的值排除某些DataFrame行

时间:2019-02-21 12:13:10

标签: python pandas dataframe for-loop jupyter-notebook

我有10000个文件的文件夹,其中包含10个变量(X1,X2,...,X10)的数据。

文件名仅为File1.json,File2.json等。

我需要为每个变量创建一个数据框,即10个数据框。

输入

  • VARIABLES = [X1,X2,...,X10]
  • FILES = [File1.json,File2.json,... File14347.json]

所需的输出

  • X1,X2,...,X10的数据框

我正在执行以下操作

for i in range(0, len(VARIABLES)):
    %reset_selective -f "^DATA$"
    DATA=pd.DataFrame()
    Data_name=VARIABLES[i]
    print(Data_name)
    for ii in range(0, len(FILES)):

        file_name1='Directory/'
        file_name2= FILES[ii]
        file_name=file_name1+file_name2
        with open(file_name, 'r') as fer:
             data1 = json.load(fer)
        df = pd.DataFrame({'count': data1})

        Var_namei=df['count']['consistname']
        if Var_namei==Data_name:
            #create Dataframe

代码对于第一个变量工作正常,因为我不知道哪个文件包含X1的数据。

但是,从第二次迭代开始,没有必要重新打开每个文件来查找X2的数据。 同样,到达最后一次迭代时,我应该只打开X10的文件。

我想避免打开/考虑其数据已被用作DataFrame输入的文件,例如File2包含X1的值,因此当我寻找X2,X3等的值时,我不想再次打开File2

我尝试添加

k.iloc[ii,i]= ii

其中k是if条件之后的零大小数据帧(File,VAriable),以便在打开变量i的文件ii时在i列和ii行中放置1。这样,我可以在下一个迭代过程中跳过此类ii行文件。 但是,我无法在for循环中访问k个值。

有什么建议吗? 谢谢

1 个答案:

答案 0 :(得分:1)

欢迎来到SO。如果进行一些重构,您的代码会更简单。

file_name1='Directory/'
FileDATA={}
for file_name2 in FILES:
    file_name=file_name1+file_name2
    with open(file_name, 'r') as fer:
        data1 = json.load(fer)
    if data1['consistname'] in VARIABLES:
        # Save the data1 object to FileDATA
        # Assuming that every element in VARIABLES is unique
        Data_name=data1['consistname']
        FileDATA[Data_name] = data1

for Data_name in VARIABLES:
    data1 = FileDATA[Data_name]
    df = pd.DataFrame({'count': data1})
    # create Dataframe

第一个循环一次遍历所有文件,并将与变量[X1, X2, ..., X10]对应的数据保存在字典FileDATA中。然后,您可以遍历变量以处理数据。

删除不必要的行后,

FileDATA={}
for file_name2 in FILES:
    with open('Directory/' + file_name2, 'r') as fer:
        data1 = json.load(fer)
    if data1['consistname'] in VARIABLES:
        FileDATA[data1['consistname']] = data1

for Data_name in VARIABLES:
    df = pd.DataFrame({'count': FileDATA[Data_name]})
    # create Dataframe