Python 3.x 在for循环中提取子数据帧loc

Python 3.x 在for循环中提取子数据帧loc,python-3.x,pandas,dataframe,Python 3.x,Pandas,Dataframe,我在将一个数据帧分为子集,然后将它们加入for循环时遇到了问题。 原始数据帧如下所示: *请原谅,我遗漏了一些细节,以避免数据安全/策略方面的问题。只要信息被传达 这是一个查询问题,我需要从包含调查名称的另一个列表中查询每个“Surveyname”,并将所有调查(按列表顺序)及其所选列的其他信息输出到一个表中。 原始数据帧包含以下列: Index(['Surveyname', 'Surveynumber', 'Datasetstatus', 'Datasetname', 'Dataset

我在将一个数据帧分为子集,然后将它们加入for循环时遇到了问题。 原始数据帧如下所示:

*请原谅,我遗漏了一些细节,以避免数据安全/策略方面的问题。只要信息被传达

这是一个查询问题,我需要从包含调查名称的另一个列表中查询每个“Surveyname”,并将所有调查(按列表顺序)及其所选列的其他信息输出到一个表中。 原始数据帧包含以下列:

Index(['Surveyname', 'Surveynumber', 'Datasetstatus', 'Datasetname',
   'Datasetprocessname', 'Datasetdatatype', 'Datasetseismicformat',
   'Datasettapedisplay', 'Inventoryid', 'Inventoryname',
   'Inventorybarcode', 'Inventoryremarks', 'Datashipmentnumber',
   'Facilityid', 'Facilityname', 'Inventoryfullpathfilename',
   'Inventorytype', 'Mmsdatasetname', 'Inventorymediatype',
   'Inventoryoriglocation', 'Inventoryreceiveddate',
   'Inventorydataattribdesc', 'Firstalternatedesc', 'Secondalternatedesc',
   'Thirdalternatedesc', 'field26', 'field27', 'field28', 'field29',
   'field30', 'field31', 'field32'],
  dtype='object')
我只选择以下列作为输出:

cols =['Surveyname','Surveynumber','Datasettapedisplay','Inventoryid','Inventorybarcode','Inventoryoriglocation']
我在开始时设置了一个空的数据帧,并尝试将“查询的”子集数据帧附加到此数据帧。希望它能和for循环一起成长。 代码如下所示:

f=open('EmptySurveyList2.txt','r')
cols =['Surveyname','Surveynumber','Datasettapedisplay','Inventoryid','Inventorybarcode','Inventoryoriglocation']

setdf=pd.DataFrame(columns=cols)# create an empty DataFrame

for line in f:
    print(line)
    # check by string content
    df0=df_MIG.loc[df_MIG['Surveyname']==line,cols]
    print(df_MIG.loc[df_MIG['Surveyname']==line,cols])
    # check by string length for exact match
    df0=df0.loc[df0['Surveyname'].str.len()==len(line),cols]
    print(df0.loc[df0['Surveyname'].str.len()==len(line),cols])
    print('df0:',len(df0))

    setdf=setdf.append(df0)
    print('setdf:',len(setdf))
然而,这段代码仍然只给出了“setdf”数据帧上最后一次调查的几行。 我继续调试。我发现在for循环中,df0数据帧没有从主
df_MIG
中找到列表中前N个测量的测量信息,最后一个除外。通过打印出
df0
setdf
的长度:

>...Centauro
>
>Empty DataFrame
>Columns: [Surveyname, Surveynumber, Datasettapedisplay, Inventoryid, 
>Inventorybarcode, Inventoryoriglocation]
>Index: []
>Empty DataFrame
>Columns: [Surveyname, Surveynumber, Datasettapedisplay, Inventoryid, 
>Inventorybarcode, Inventoryoriglocation]
>Index: []
>df0: 0
>
>setdf: 0
>
>Blueberry
>
>Empty DataFrame
>Columns: [Surveyname, Surveynumber, Datasettapedisplay, Inventoryid, 
>Inventorybarcode, Inventoryoriglocation]
>Index: []
>Empty DataFrame
>Columns: [Surveyname, Surveynumber, Datasettapedisplay, Inventoryid, 
>Inventorybarcode, Inventoryoriglocation]
>Index: []
>df0: 0
>
>setdf: 0
>
>Baha (G)
>    Surveyname Surveynumber Datasettapedisplay Inventoryid Inventorybarcode  \
>219   Baha (G)       329130                FIN     1538554          4210380   
>
>Inventoryoriglocation  
>219  /wgdisk/hn0016/mc03/BAHA_329130/MIGFIN_639_256...  
>    Surveyname Surveynumber Datasettapedisplay Inventoryid Inventorybarcode  \
>219   Baha (G)       329130                FIN     1538554          4210380   
>
>Inventoryoriglocation  
>219  /wgdisk/hn0016/mc03/BAHA_329130/MIGFIN_639_256...  
>df0: 1
>
>setdf: 1
如果我在循环之外进行查询

a = "Blueberry"
df0=df_MIG.loc[df_MIG['Surveyname']==a,cols]
df0=df0.loc[df0['Surveyname'].str.len()==len(a),cols]
setdf=setdf.append(df0)
它工作正常,没有问题,找到了具有调查名称的行,并将其添加到
setdf


这对我来说是个谜。任何人都可以帮助澄清原因,或提出更好的替代方案?

您是在循环之外追加,因此您只能将
df0
的最后一个值追加到
setdf
。相反,在循环
df_list=[]
上方初始化一个空列表,在循环内附加到列表
df_list.append(df0)
(这样,每次迭代时都记录
df0
),然后在循环外部使用单个连接创建数据帧
set\u df=pd.concat(df\u list)
很抱歉,我没有正确编辑代码块,
set\u df=set\u df.append(df0)
实际上在循环的一侧。我发现在迭代过程中,
df0
没有得到正确更新。
len(df0)
为零,它应该找到一些行并包含非空数据帧。这就是为什么我的最后一盘很短。比如3行(应该超过100行)。如果
df0
更新,我一定会尝试您提到的
pd.concat
。谢谢我意识到读入的文件在每一行都有一个“\n”下一行,直到最后一行。“\n”被包括在内,并导致除最后一行之外的不匹配。一旦我拆分字符串并取出“\n”,代码就可以正常工作。