使用Python提取和匹配处理多个数据框的项目

时间:2019-06-04 15:01:47

标签: python regex python-3.x pandas dataframe

我有两个数据框,可以使用以下代码创建

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)我的目标是从df2的'level_0'列中获取值,并在df1的'VARIABLE'列中查找以获取其满足以下条件的“备注” 列值

  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)我的目标与上面相同,但是在这里我想从df2的'0'列中获取值,并在'个人信息'中查找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循环,因为这些值可能在重复。例如,我们可能有一个匹配值'No',但df1 ['VARIABLE']可能不是虚拟的。因此,我在两种情况下都增加了id值,以查找下一次出现的“ No”是否对VARIABLE列具有“ Dummy”值。情况1也是如此

b)当在“注释”,“无案”中找到匹配项时,如何处理“否”之类的情况。正如您从我的代码中看到的那样,我正在使用正则表达式,但此处仍然遇到错误。

如您所见,我正在对代码进行一些修改并将其编写两次。如何使它优雅高效?我相信必须有非常简单的方法来做到这一点。

也欢迎有关更改源数据的数据格式或使用合并/联接方法的替代方法的任何建议/想法。

我希望输出,即“备注”值存储在列表中。请找到我所做的屏幕截图

enter image description here

1 个答案:

答案 0 :(得分:1)

您应该尽可能避免在熊猫中出现显式循环,因为它们不会被矢量化(在熊猫和numpy措辞中进行了优化)。在这里,您可以合并数据框:

  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是一个空的数据框。