在for循环中提取子数据帧

时间:2018-07-05 17:49:09

标签: python-3.x pandas dataframe

在将整个Pandas数据帧切成子集然后将它们加入for循环时遇到问题。 原始数据框如下所示:

original DataFrame content

*请原谅我屏蔽了一些详细信息,以避免数据安全/策略方面的问题。只要传达信息即可。

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

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数据帧未从列表中的前N个调查的主df_MIG中找到调查信息。通过打印df0setdf的长度:

>...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 Bebugging outside loop

这对我来说是个谜。任何人都可以帮助阐明原因,或提出更好的选择?

0 个答案:

没有答案