加快Pandas DataFrame Groupby的应用

时间:2019-01-17 19:12:37

标签: python pandas dataframe pandas-groupby

我在下面的另一篇文章中找到了以下代码(并稍作修改)。它的效果很好,输出也和我期望的一样,但是我想知道是否有人对速度改进有建议。我正在将两个数据帧与大约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))

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

与您的方法得到的结果相同。