我有两个数据框,可以使用以下代码创建
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]})
df2 = df2 = pd.DataFrame({'level_0': ['studyid','age_interview','gender','dobyear','ethderived','smoke','alcohol'],
'0':['tmp001', 56,'Female',1950,'Chinese','No', 'Yes']})
目标
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)当在“注释”,“无案”中找到匹配项时,如何处理“否”之类的情况。正如您从我的代码中看到的那样,我正在使用正则表达式,但此处仍然遇到错误。
如您所见,我正在对代码进行一些修改并将其编写两次。如何使它优雅高效?我相信必须有非常简单的方法来做到这一点。
也欢迎有关更改源数据的数据格式或使用合并/联接方法的替代方法的任何建议/想法。
我希望输出,即“备注”值存储在列表中。请找到我所做的屏幕截图
答案 0 :(得分:1)
您应该尽可能避免在熊猫中出现显式循环,因为它们不会被矢量化(在熊猫和numpy措辞中进行了优化)。在这里,您可以合并数据框:
场景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:
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
是一个空的数据框。