【问题标题】:For loop excluding some DataFrame rows based on a specified valueFor 循环根据指定值排除某些 DataFrame 行
【发布时间】:2019-02-21 12:13:10
【问题描述】:

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

文件名就是File1.json、File2.json等。

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

输入

  • 变量= [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 打开时将 1 放入 i 列和 ii 行。这样,我可以在下一次迭代期间跳过这样的 ii 行文件。 但是,我无法在 for 循环期间访问 k 值。

有什么建议吗? 谢谢

【问题讨论】:

  • 能否请您缩进代码的第一个 for 循环并提供输入示例和所需结果?
  • 每个文件是包含单个值还是多个值?
  • 多个值,从 100 到 50000 个值。事先不知道每个文件的数据量,即我需要打开文件并提取所有值才能知道它们的数量
  • 您是否尝试使用 pd.read_json 将每个文件读入 DataFrame,然后根据列进行处理?
  • 是的,问题是文件是嵌套的 json,因此我有“第一级”的变量名称,然后是第二级的数据和子变量,我得到 json.loads(First_Json_variable)

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


【解决方案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

【讨论】:

  • 我还设法从目录中删除了已经考虑过的文件。
猜你喜欢
  • 1970-01-01
  • 2016-10-11
  • 2021-09-22
  • 2018-02-04
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
  • 2017-03-28
  • 2017-10-04
相关资源
最近更新 更多