Передача списка номеров строк в 2 кадра данных, маркировка и добавление в новый кадр данных - PullRequest
0 голосов
/ 24 мая 2018

Это все в питон пандах.

У меня есть список целых чисел с именем different_rows, который содержит номер строки каждой строки, которая имеет различия между двумя кадрами данных.В данном случае это фрейм данных, содержащий данные из netezza, и фрейм данных, содержащий данные из oracle.(prepped_net_df, prepped_ora_df)

Я пытаюсь передать номер строки в исходные кадры данных, чтобы получить строку данных из фрейма данных.Я хочу добавить тег в эту строку, чтобы узнать, из какого источника данных он получен (например, netezza или oracle), а затем я хочу добавить эту строку (серию) в новый информационный кадр.Этот int из different_rows должен быть передан как в рамки данных netezza, так и в oracle.

Следующий код работает, но проблема в том, что он работает очень медленно.

У меня есть 2 вопроса.

  1. Каков наилучший подход для проверки того, какая из строк вызывает медленную работу?
  2. Есть ли способ оптимизировать этот код.Это прекрасно работает для 10-1000 строк, но иногда у меня есть фреймы данных, которые десятки тысяч строк.

Спасибо за ваше время.Любая помощь приветствуется

net_dict = {'ACCTG_DATE': ['2012-01-01 00:00:00', '2012-01-02 00:00:00', '2012-01-03 00:00:00', '2012-01-04 00:00:00' ], 'JRNL_ID_NO': ['00349-CAS','00350-CAS','00351-CAS','00352-CAS' ], 'JRNL_SEQ_NO': [43970,43971,43972,43973], 'ACCT_CODE': [8500016,8500017,8500018,8500019], 'BAL_BOOK_CODE': [8591,8592,8593,8594], 'PROD_CODE': ['12F7', '12F8', '12F9', '12G0'], 'SUSPENSE_SEQ_NO': [0, 1, 2, 3 ], 'TRAN_AMT': [8900.29, 8901.29, 8902.29, 8903.29], 'CENTER_CODE': ['', '', '', ''], 'BASIS_TYPE': ['C', 'C', 'C', 'C'], 'UPDATE_TSTP':['2011-12-31 00:00:00', '2012-01-01 00:00:00', '2012-01-02 00:00:00', '2012-01-03 00:00:00']}
ora_dict = {'ACCTG_DATE': ['2012-01-01 00:00:00', '2012-01-02 00:00:00', '2012-01-04 00:00:00', '2012-01-04 00:00:00' ], 'JRNL_ID_NO': ['00349-CAS','00350-CAS','00351-CAS','00353-CAS' ], 'JRNL_SEQ_NO': [43970,43971,43972,43973], 'ACCT_CODE': [8500016,8500017,8500018,8500019], 'BAL_BOOK_CODE': [8591,8592,8593,8594], 'PROD_CODE': ['12F7', '12F8', '12F9', '12G0'], 'SUSPENSE_SEQ_NO': [0, 1, 2, 3 ], 'TRAN_AMT': [8900.29, 8901.29, 8903, 8903.29], 'CENTER_CODE': ['', '', '', ''], 'BASIS_TYPE': ['C', 'C', 'C', 'C'], 'UPDATE_TSTP':['2011-12-31 00:00:00', '2012-01-01 00:00:00', '2012-01-02 00:00:00', '2012-01-03 00:00:00']}

different_rows = [2, 3]

prepped_net_df = pd.DataFrame(data=net_dict)
prepped_ora_df = pd.DataFrame(data=ora_dict)
prepped_net_df.infer_objects()
prepped_ora_df.infer_objects()

row_compare_df = pd.DataFrame()

if different_rows != None:
    start = time.clock()
    for val in different_rows:
        print('processed: val - ', val)
        net_series = prepped_net_df.iloc[val]
        net_series.loc['Source'] = "Netezza"
        row_compare_df = row_compare_df.append(net_series)
        ora_series = prepped_ora_df.iloc[val]
        ora_series.loc['Source'] = "Oracle"
        row_compare_df = row_compare_df.append(ora_series)
    end = time.clock() - start
    print("Cell has run completely. It took " + str(round(end, 2)) + " seconds")    
else:
    print("There were no rows reported with differences")

1 Ответ

0 голосов
/ 25 мая 2018

Вам не нужно перебирать свой список.Все, что вам нужно, это передать список и получить строки из ваших dfs, а затем объединить их, как показано ниже:

net = prepped_net_df.iloc[different_rows].assign(Source='Netezza')
ora = prepped_ora_df.iloc[different_rows].assign(Source='Oracle')
row_compare_df = pd.concat([net, ora], ignore_index=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...