Извлечение и сопоставление элементов, имеющих дело с несколькими фреймами данных, используя Python - PullRequest
0 голосов
/ 04 июня 2019

У меня есть два кадра данных, которые могут быть созданы с использованием кода, показанного ниже

df1 = pd.DataFrame({'home':[1,np.nan,2,np.nan,3,4],
 'PERSONAL INFORMATION':['Study Number', 'Study ID','Age when interview 
 done', 'Derived using date of birth','Gender','ethnicity],
   'VARIABLE': 
['studyid','dummy','age_interview','dummy','gender','Chinese'],
    'Remarks':[2000000001,20005000001,4265453,0,4135376,2345678]})

enter image description here

 df2 = df2 = pd.DataFrame({'level_0': ['studyid','age_interview','gender','dobyear','ethderived','smoke','alcohol'],
 '0':['tmp001', 56,'Female',1950,'Chinese','No', 'Yes']})

enter image description here

Цель

1) Моя цель - взять значения из 'level_0' столбца df2 и найти их в 'VARIABLE' столбец df1, чтобы получить их значение столбца 'Remarks' при условии, что оно удовлетворяет следующему условию

  a) 'Home' column of df1 should contain digits as part of their value( Ex: 1,2,3,4,B1.5,C1.9, D1.2 etc are all valid values for 'Home' column) 

2) Моя цель та же, что и выше, ноздесь я хотел бы взять значения из '0' столбца df2 и искать их в 'ЛИЧНАЯ ИНФОРМАЦИЯ' столбца df1, чтобы получить их 'Замечания' значение при условии, что оно удовлетворяет следующему условию

  a) 'VARIABLE' column of df1 should contain 'dummy' as a value

Для вышеупомянутых двух сценариев я написал приведенный ниже код, но по какой-то причине я чувствую, что он довольно длинный / неэффективный.Должен быть простой способ сделать это.

Сценарий - 1

qconc_id = []
missed_items=[]
col_list=[]
for i in df7.index:
   ques = df7['level_0'][i]
   col_list.append(ques)
   try:
      qindex = int(df[df['VARIABLE']==ques].index[0]), 
                    df.columns.get_loc('VARIABLE')
    pos_qindex = qindex[0]
    ques_value = df['home '][pos_qindex]
    result = re.match(r"[A-Z]?[\d]?[\.]?[\d]+", ques_value)
    while result is None:
        pos_qindex = pos_qindex-1
        ques_value = df['home '][pos_qindex]
        result = re.match(r"[A-Z]?[\d]?[\.]?[\d]+", ques_value)
    qconc_id.append(df['Remarks'][pos_qindex])
    except:
        missed_items.append(ans)

Сценарий - 2

aconc_id = []
missed_items=[]
ans_list=[]
for i in df7.index:
    ans = df7[0][i]
    print("ans is ",ans)
    ans_list.append(ans)
    idx=0
    try:
        aindex = df[df['PERSONAL 
         INFORMATION'].str.contains(ans,case=False,regex=False)].index
         print(aindex)
         pos_aindex = aindex[idx]
         while (df['VARIABLE'][pos_aindex] !='dummy') and 
        (df['PERSONAL INFORMATION'].str.contains('Yes|No',regex=True) 
        [pos_aindex])==False):
             pos_aindex = aindex[idx+1]
         print("The value is ",df['Remarks'][pos_aindex])
         aconc_id.append(df['Remarks'][pos_aindex])
    except:
          print("Goes to Exception")
          aconc_id.append('0')
          missed_items.append(ans)

Обратите внимание на эти две вещи

a) Я использовал цикл while, потому что значения могут повторяться.Например, у нас может быть соответствующее значение как «Нет», но df1 ['VARIABLE'] может не быть фиктивным.Поэтому я увеличиваю значения идентификаторов в обоих сценариях, чтобы определить, имеет ли следующее вхождение «Нет» значение «Пустышка» для столбца VARIABLE.То же самое относится и к сценарию 1

b) Как я могу обрабатывать сценарии, такие как «Нет», когда находит совпадения в «Заметках», «Nocase».Как вы можете видеть из моего кода, что я использую регулярное выражение, но он все еще сталкивается с ошибкой здесь.

Как видите, я делаю некоторые изменения в коде и пишу его дважды.Как я могу сделать это элегантно и эффективно?Я уверен, что должен быть очень легкий и простой способ сделать это.

Также приветствуются любые предложения / идеи относительно альтернативного подхода к изменению формата данных исходных данных или использованию подхода слияния / объединения.

Я ожидаю, что вывод, значение «Замечания» будет сохранено в списке.Пожалуйста, найдите скриншот того, что я сделал

enter image description here

1 Ответ

1 голос
/ 04 июня 2019

Вы должны избегать как можно большего числа явных циклов в пандах, потому что они не будут векторизованы (оптимизированы в пандах и в единой формулировке). Здесь вы можете объединить ваши фреймы данных:

  1. Сценарий 1:

    # extract values where df2.level_0 == df1.VARIABLE
    tmp = pd.merge(pd.DataFrame(df2.level_0), df1.loc[:,['home', 'VARIABLE', 'Remarks']],
         left_on = ['level_0'], right_on=['VARIABLE'])
    # drop lines where home would not contain a digit
    tmp.drop(tmp.loc[~tmp.home.astype(np.str_).str.contains(r'\d')].index,
         inplace=True)
    # extract the Remarks column into a list
    lst = tmp.Remarks.tolist()
    

    С вашими примерами я получаю [2000000001, 4265453, 4135376]

  2. Сценарий 2:

    tmp = pd.merge(pd.DataFrame(df2['0']), df1.loc[:,['PERSONAL INFORMATION',
                              'VARIABLE', 'Remarks']],
         left_on = ['0'], right_on=['PERSONAL INFORMATION'])
    tmp.drop(tmp.loc[~tmp['VARIABLE'] == 'dummy'].index, inplace=True)
    lst.extend(tmp.Remarks.tolist())
    

    С вашими примерами я не получаю никаких дополнительных значений, потому что на первом шаге tmp - это пустой фрейм данных.

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