熊猫库:df_left.merge(df_right) 概要统计学

5
关于Pandas: df.merge() 方法,有没有一种方便的方法来获取合并的摘要统计信息(比如匹配数量、未匹配数量等等)。我知道这些统计数据取决于how='inner'标志,但是知道在使用内联结时被“丢弃”了多少内容会很方便。我可以简单地使用以下代码:
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和一个报告序列或数据帧)


只是提一下,set(df_right[common_column].unique())set(df_right[common_column]) 是一样的 :) - Andy Hayden
1
我认为没有内置的方法来实现这个,但只需使用 set(可能也是你的方式),这将是相当高效的。 - Andy Hayden
啊...是的,关于设置注释的问题!谢谢 :) - sanguineturtle
2个回答

1
尝试这个函数...然后您可以像这样将参数传递给它:
df = merge_like_stata(df1, df2, mergevars)

函数定义:

def merge_like_stata(master, using, mergevars):
    master['_master_merge_'] = 'master'
    using['_using_merge_'] = 'using'
    df = pd.merge(master, using, on=mergevars, how='outer')
    df['_master_merge_'] = df['_master_merge_'].apply(lambda x: 'miss' if pd.isnull(x) else x)
    df['_using_merge_'] = df['_using_merge_'].apply(lambda x: 'miss' if pd.isnull(x) else x)
    df['_merge'] = df.apply(lambda row: '3 - Master Only' if row['_master_merge_']=='master' and row['_using_merge_'] =='using' else None, axis=1)
    df['_merge'] = df.apply(lambda row: '2 - Master Only' if row['_master_merge_']=='master' and row['_using_merge_'] =='miss' else row['_merge'], axis=1)
    df['_merge'] = df.apply(lambda row: '1 - Using Only' if row['_master_merge_']=='miss' and row['_using_merge_'] =='using' else row['_merge'], axis=1)
    df['column']="Count"
    pd.crosstab(df._merge, df.column, margins=True)
    df = df.drop(['_master_merge_', '_using_merge_'], axis=1)
    return print(pd.crosstab(df._merge, df.column, margins=True))
    return df

我认为有一个打字错误:“3 - Master Only” -> “3 - Combined”。 - Javi Carnero

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接