我在下面的另一篇文章中找到了以下代码(并稍作修改)。它的效果很好,输出也和我期望的一样,但是我想知道是否有人对速度改进有建议。我正在将两个数据帧与大约93,000行和110列进行比较。完成groupby大约需要20分钟。我试图思考加快速度的方法,但没有遇到任何问题。我想在将来我的数据大小增加之前考虑任何事情。我也乐于接受其他方式!
###Function that is called to check values in dataframe groupby
def report_diff(x):
return 'SAME' if x[0] == x[1] else '{} | {}'.format(*x)
#return '' if x[0] == x[1] else '{} | {}'.format(*x)
print("Concatening CSV and XML data together...")
###Concat the dataframes together
df_all = pd.concat(
[df_csv, df_xml],
axis='columns',
keys=['df_csv', 'df_xml'],
join='outer',
)
print("Done")
print("Swapping column levels...")
###Display keys at the top of each column
df_final = df_all.swaplevel(axis='columns')[df_xml.columns[0:]]
print("Done")
df_final = df_final.fillna('None')
print("Grouping data and checking for matches...")
###Apply report_diff function to each row
df_excel = df_final.groupby(level=0, axis=1).apply(lambda frame: frame.apply(report_diff, axis=1))
答案 0 :(得分:1)
您可以使用here并检查df_csv[df_xml.columns]
等于df_xml
的位置,如果True
则值为'SAME'
,否则您可以加入两个数据框都像您一样。
设置
df_csv = pd.DataFrame({'a':range(4),'b':[0,0,1,1],'c':list('abcd')})
df_xml = pd.DataFrame({'b':[0,2,3,1],'c':list('bbce')})
方法
df_excel = pd.DataFrame( np.where( df_csv[df_xml.columns] == df_xml, #find where
'SAME', #True
df_csv[df_xml.columns].astype(str) + ' | ' + df_xml.astype(str)), #False
columns=df_xml.columns
index=df_xml.index)
print (df_excel)
b c
0 SAME a | b
1 0 | 2 SAME
2 1 | 3 SAME
3 SAME d | e
与您的方法得到的结果相同。