Ускорить Pandas DataFrame Groupby Применить - PullRequest
0 голосов
/ 17 января 2019

У меня есть следующий код, который я нашел в другом посте здесь (и немного изменил). Он отлично работает, и результат такой, как я ожидал, однако мне интересно, есть ли у кого-нибудь предложения по улучшению скорости. Я сравниваю два кадра данных с примерно 93 000 строк и 110 столбцов. Группе требуется около 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 голосов
/ 17 января 2019

Вы можете использовать np.where и проверить, где df_csv[df_xml.columns] равно df_xml, если True, то значение равно 'SAME', иначе вы можете объединить значения обоих фреймов данных, как вы делаем.

SETUP

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

То же самое, что я получил с вашим методом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...