извлекать субкадр loc для цикла for - PullRequest
0 голосов
/ 05 июля 2018

У меня проблема с разделением всего фрейма данных Pandas на подмножества и последующим объединением их в цикл for. Исходный кадр данных выглядит следующим образом:

оригинальное содержание DataFrame

* Простите, что я заблокировал некоторые детали, чтобы избежать проблем с безопасностью данных / политикой. Пока сообщение передается.

Это проблема запроса, которую мне нужно запросить для каждого "Surveyname" из другого списка, который содержит названия опросов, и вывести их в таблицу всех опросов (в последовательностях списка) и их другую информацию из выбранных столбцов. Исходный Dataframe имеет следующие столбцы:

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 Пьяный внешний цикл

Это довольно загадка для меня. Кто-нибудь может помочь уточнить почему или предложить лучшую альтернативу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...