Python 通过应用加快数据帧分组速度

Python 通过应用加快数据帧分组速度,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,我在这里的另一篇文章中找到了下面的代码(并稍作修改)。它工作得很好,输出和我期望的一样,但是我想知道是否有人对速度改进有建议。我正在比较两个数据帧,大约有93000行和110列。groupby大约需要20分钟才能完成。我试着想办法加快速度,但没有遇到任何问题。在我的数据量在未来增加之前,我现在正在努力思考任何事情。我也愿意用其他方法来做这件事 ###Function that is called to check values in dataframe groupby def repo

我在这里的另一篇文章中找到了下面的代码(并稍作修改)。它工作得很好,输出和我期望的一样,但是我想知道是否有人对速度改进有建议。我正在比较两个数据帧,大约有93000行和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))
您可以使用并检查
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

这和我用你的方法得到的结果是一样的。

你能为
df_csv
df_xml
创建一些虚拟数据吗(最好是字典格式)?我觉得使用矢量化操作/@SvenHarris可以大大加快速度。对不起,你能澄清一下吗?你是说你想看一些虚拟数据吗?这两个变量中的数据分别从CSV和XML文件中读取,然后在执行这些步骤之前进行大量处理,这将有助于理解代码是如何运行的,并验证给定的答案是否返回预期值。@SvenHarris希望这有帮助,这是一些示例数据(已修改)df_csv.head(2)。to_dict()Out[84]:'I1SP-1C':{'123456789':'普通股','987654321':'普通股'},'I1SP-1E':{'123456789':'DIVIDENDSCOMMON','987654321':'DIVIDENDSCOMMON','I1SP-3C':{'123456789':'HEALTH CARE PROVIDERS&SERVICES','987654321':'BUILDING PRODUCTS','I1SP-3E':{'123456789':'BQZJBY4','987654321':'2268130','I1SP-3Z':{'123456789':'0','987654321',这真是太棒了,效果也很好,只是这样做时我会丢失两个索引列,我可以在这里保留索引列吗?编辑:我添加了“index=df_xml.index”到PD.DATAFRAME代码的末尾,它看起来很好!这比原来的代码快很多!谢谢!克里斯布朗索引的好点,我不认为它们是重要的。我将编辑我的答案以包括它:)所以我还有另一个难题……有没有想过如何用重复的索引值运行像这样的代码?甚至是这样吗?可能吗?我在使用重复索引值尝试此代码时遇到此错误:ValueError:只能比较标记相同的DataFrame对象真是太感谢你了!太好了,你一直是个救命恩人!