从函数重写数据帧,而不是追加

2024-10-01 13:26:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个函数,可以在API的容器中查找,您可以在下面看到。本质上,我正在尝试创建一个Nx4数据帧,其中包含API上所有符合特定条件的文件(“嵌套字典中特定键中的func”和“anat”,以及文件类型为nifti)。N=找到的文件数,subjectLabelsessionLabel是一对变量,用于识别研究中的受试者。我基本上获得了所有符合这些对标准的文件(嵌套字典中的anat和func,以及nifti类型):

def find_intent(projectLabel, subjectLabel, sessionLabel, group = 'pennftdcenter'):
    
    # Initialize subject session pairs to lookup
    import flywheel
    fw = flywheel.Client()
    s = fw.lookup('/'.join([group, projectLabel, str(subjectLabel), str(sessionLabel)]))
    import pandas as pd
    
    results = None
    results_failed = False
    Intent_df = None


    # Look into BIDS metafield and print out (testing purposes) 
    # the paths and BIDS parent folder if functional or anatomical data was found.
    matches = ["func", "anat"]
    d = []
    
    for acq in s.acquisitions():
        try:
            for f in acq.files:
                ext = f.type
                if 'BIDS' in f.info.keys():
                    fBIDS = f.info['BIDS']['Folder']
                    if any(i in fBIDS for i in matches) and ext == 'nifti':
                        results = str(fw.get(acq.parents.subject).label) + "," + str(fw.get(acq.parents.session).label) + "," + str(fBIDS) + "," + str(f.info['BIDS']['Filename'])
                        print(results, '\n')
                        d.append(
                            {
                                'SubjectLabel': str(fw.get(acq.parents.subject).label), 
                                'SessionLabel': str(fw.get(acq.parents.session).label), 
                                'Intent': str(fBIDS),
                                'FileName': str(f.info['BIDS']['Filename'])
                            }
                        )
                        
    
                #else:
                    #print("Subject-Session Pair not curated:", subjectLabel, sessionLabel)
        except Exception as e:
            print(e, '\n')
            #print('Subject not curated:', subjectLabel, sessionLabel)
            results_failed=e
            pass
    
    Intent_df = pd.DataFrame(d) 
    
     
    return (Intent_df)

我试图将行Intent_df = pd.DataFrame(d)移动到循环中的不同位置以防止覆盖,但没有成功。我还尝试将空数据帧初始化为d,然后执行.append(),但这也不起作用

下面是我在运行一批主题时如何运行函数。这个循环迭代我已经导入的csv,并将主题和会话存储在两个相应的列表中。我将df作为我试图输出的输出数据帧,但它总是以最后一个主题会话对结束:

findintent_fails_subject_labels = []
findintent_fails_session_labels = []
for h in range(len(subject_labels)):
    try:
        df = find_intent('test_project', subject_labels[h], session_labels[h])
    except Exception as e:
        print(e)
        findintent_fails_subject_labels.append(subject_labels[h])
        findintent_fails_session_labels.append(session_labels[h])

我的函数是否有问题,或者在运行它的第二个循环中如何调用该函数

提前谢谢


Tags: 函数indflabelssessionresultssubjectprint