我正在尝试使用pandas在数据帧上逐行循环,并且对于每一行,我想将该行与另一个数据帧的每一行(大致为len 7)进行比较。
数据帧相当大(索引是从10月到10月的10分钟频率)和嵌套的for循环我需要一个年龄来运行(大约20分钟);
frame['Group1 ON With Exception'] = ''
for i in range(len(frame)):
for j in range(len(grp1_extpn_tbl)):
if ((frame.ix[i,'T01\n(kWh) ':'T22\n(kWh) ']>1) == (grp1_extpn_tbl.loc[j]>0)).all():
frame.ix[i,'Group1 ON With Exception'] = ''
break
else:
frame.ix[i,'Group1 ON With Exception'] = 'NOT VALID GROUP1 DATA'
显然,对于大熊猫,关键是要避免循环,所以我想出了使用嵌套的np.where,这大大加快了速度(比如3分钟)。问题是它看起来是一个非常繁琐的代码块,我想知道是否有另一种替代方案,甚至比这更多地压缩这个代码块? ;
frame['Group1 ON With Exception'] = ''
frame['Group1 ON With Exception'] = np.where((frame.loc[:,'T01\n(kWh) ':'T22\n(kWh) ']).apply(lambda x: ((x>1) == (grp1_extpn_tbl.loc[0] > 0)).all(), axis=1),'',
np.where((frame.loc[:,'T01\n(kWh) ':'T22\n(kWh) ']).apply(lambda x: ((x>1) == (grp1_extpn_tbl.loc[1] > 0)).all(), axis=1),'',
np.where((frame.loc[:,'T01\n(kWh) ':'T22\n(kWh) ']).apply(lambda x: ((x>1) == (grp1_extpn_tbl.loc[2] > 0)).all(), axis=1),'',
np.where((frame.loc[:,'T01\n(kWh) ':'T22\n(kWh) ']).apply(lambda x: ((x>1) == (grp1_extpn_tbl.loc[3] > 0)).all(), axis=1),'',
np.where((frame.loc[:,'T01\n(kWh) ':'T22\n(kWh) ']).apply(lambda x: ((x>1) == (grp1_extpn_tbl.loc[4] > 0)).all(), axis=1),'',
np.where((frame.loc[:,'T01\n(kWh) ':'T22\n(kWh) ']).apply(lambda x: ((x>1) == (grp1_extpn_tbl.loc[5] > 0)).all(), axis=1),'',
np.where((frame.loc[:,'T01\n(kWh) ':'T22\n(kWh) ']).apply(lambda x: ((x>1) == (grp1_extpn_tbl.loc[6] > 0)).all(), axis=1),'','NOT VALID GROUP1 DATA')))))))
希望以上是足够的信息,任何帮助都将不胜感激。
谢谢,
答案 0 :(得分:0)
而不是使用i,j来运行数据帧,而是使用iterrows()。
for index, row in df1.iterrows():
if row['column'] in df2['column_to_compare_to']:
do_something()
else:
do_something_else()
或者,为什么不循环遍历len 7的小数据帧并从大数据帧中选择?如果select变为空,则执行某些操作,如果select返回结果,则执行某些操作。希望有所帮助!