2013-06-16 3 views
4

Что касается метода Pandas: df.merge(), то это их удобный способ получить сводную статистику слияния (например, количество совпадений, количество несоответствий и т. Д.), , Я знаю, что эта статистика зависит от того, как «внутреннего» флага =, но было бы удобно знать, сколько в настоящее время «отбрасываются» при использовании внутреннего соединения и т.д. Я мог бы просто использовать:Pandas: df_left.merge (df_right) Сводная статистика

df = df_left.merge(df_right, on='common_column', how='inner') 
set1 = set(df_left[common_column].unique()) 
set2 = set(df_right[common_column].unique()) 
set1.issubset(set2) #True No Further Analysis Required 
set2.issubset(set1) #False 
num_shared = len(set2.intersection(set1)) 
num_diff = len(set2.difference(set1)) 
# And So on ... 

Но подумал, что это могут быть реализованы уже. Я пропустил это (например, что-то вроде report = True для слияния, которое вернет new_dataframe и серию отчетов или фрейм данных)

+0

Просто говоря, 'установить (df_right [common_column] .unique())' так же, как 'набор (df_right [common_column])' :) –

+1

Я не думаю, что есть встроенный способ сделать это, но с установленным (и, вероятно, вашим путем) это будет достаточно эффективно. –

+0

Ahh ... да действительно re: задайте комментарий! Благодаря :) – sanguineturtle

ответ

0

Это то, что я использую до сих пор. Это часть функции, которая передает данные согласования от одной системы кодирования к другой системе кодирования.

if report == True: 
    report_df = pd.DataFrame(data[match_on].describe(), columns=['left']) 
    report_df = report_df.merge(pd.DataFrame(concord[match_on].describe(), columns=['right']), left_index=True, right_index=True) 
    set_left = set(data[match_on]) 
    set_right = set(concord[match_on]) 
    set_info = pd.DataFrame({'left':set_left.issubset(set_right), 'right':set_right.issubset(set_left)}, index=['subset']) 
    report_df = report_df.append(set_info) 
    set_info = pd.DataFrame({'left':len(set_left.difference(set_right)), 'right':len(set_right.difference(set_left))}, index=['differences']) 
    report_df = report_df.append(set_info) 
    #Return Random Sample of [5 Differences] 
    left_diff = list(set_left.difference(set_right))[0:5] 
    if len(left_diff) < 5: 
     left_diff = (left_diff + [np.nan]*5)[0:5] 
    right_diff = list(set_right.difference(set_left))[0:5] 
    if len(right_diff) < 5: 
     right_diff = (right_diff + [np.nan]*5)[0:5] 
    set_info = pd.DataFrame({'left': left_diff, 'right': right_diff}, index=['diff1', 'diff2', 'diff3', 'diff4', 'diff5']) 
    report_df = report_df.append(set_info) 

Пример отчета

Report Sample