mars.dataframe.DataFrame.merge#
- DataFrame.merge(right: 联合[DataFrame, Series], how: 字符串 = 'inner', on: 可选[字符串] = None, left_on: 可选[字符串] = None, right_on: 可选[字符串] = None, left_index: 布尔型 = False, right_index: 布尔型 = False, sort: 布尔型 = False, suffixes: 元组[可选[字符串], 可选[字符串]] = ('_x', '_y'), copy: 布尔型 = True, indicator: 布尔型 = False, validate: 可选[字符串] = None, method: 字符串 = 'auto', auto_merge: 字符串 = 'both', auto_merge_threshold: 整型 = 8, bloom_filter: 联合[布尔型, 字符串] = 'auto', bloom_filter_options: 可选[字典[字符串, 任何]] = None) DataFrame#
使用数据库风格的连接合并DataFrame或命名Series对象。
命名的 Series 对象被视为具有单个命名列的 DataFrame。
连接是在列或索引上进行的。如果在列上连接列,则会忽略数据框的索引。否则,如果在索引上连接索引或在列或列上连接索引,则索引将被传递。在执行交叉合并时,不允许指定用于合并的列。
- Parameters
right (数据框 或 命名系列) – 要合并的对象。
如何 ({'left', 'right', 'outer', 'inner'}, 默认 'inner') –
要执行的合并类型。
left: 仅使用左侧框架的键,类似于 SQL 左外连接;保留键的顺序。
right: 仅使用右侧框架的键,类似于 SQL 右外连接;保留键的顺序。
outer: 使用两个框架键的并集,类似于 SQL 完全外连接;按字典顺序排序键。
inner: 使用两个框架键的交集,类似于 SQL 内连接;保留左侧键的顺序。
在 (标签 或 列表) – 用于连接的列或索引级名称。这些名称必须在两个 数据框中都找到。如果 在 为 None 且不根据索引合并,则默认为两个数据框中列的交集。
left_on (标签 或 列表, 或 类似数组的结构) – 在左侧 DataFrame 上进行连接的列或索引级别名称。也可以是与左侧 DataFrame 长度相等的数组或数组的列表。这些数组被视为列。
right_on (标签 或 列表, 或 类数组) – 在右侧数据框中要连接的列或索引级名称。也可以是与右侧数据框长度相同的数组或数组列表。 这些数组被视为列。
left_index (bool, 默认值为 False) – 使用左侧 DataFrame 的索引作为连接键。如果它是一个 MultiIndex,则另一个 DataFrame 中的键数(可以是索引或多个列)必须与级别的数量匹配。
right_index (bool, default False) – 使用右侧数据框的索引作为连接键。与 left_index 有相同的注意事项。
sort (bool, 默认值为 False) – 在结果 DataFrame 中按字典序对连接键进行排序。如果为 False,连接键的顺序取决于连接类型(如何连接关键字)。
suffixes (类列表, 默认值为 ("_x", "_y")) – 一个长度为2的序列,其中每个元素可以选择为一个字符串,指示要添加到left和right中重叠列名称的后缀。传递一个None值而不是字符串表示left或right中的列名称应保持不变,不添加后缀。至少有一个值不能为None。
copy (bool, 默认是 True) – 如果是 False,尽量避免复制。
indicator (bool 或 str, 默认值为 False) – 如果为 True,则在输出的 DataFrame 中添加名为 “_merge” 的列,包含每行数据的来源信息。可以通过提供字符串参数来为该列指定不同的名称。该列将具有分类类型,对于仅出现在左侧 DataFrame 中的观察值,其合并键的值为 “left_only”;对于仅出现在右侧 DataFrame 中的观察值,其合并键的值为 “right_only”;如果观察值的合并键同时出现在两个 DataFrame 中,则其值为 “both”。
validate (str, optional) –
如果指定,检查合并是否为指定类型。
”one_to_one” 或 “1:1”:检查合并键在左侧和右侧数据集中是否唯一。
”one_to_many” 或 “1:m”:检查合并键在左侧数据集中是否唯一。
”many_to_one” 或 “m:1”:检查合并键在右侧数据集中是否唯一。
”many_to_many” 或 “m:m”:允许,但不进行检查。
method ({"auto", "shuffle", "broadcast"}, default auto) – 当一个DataFrame比另一个小得多时,建议使用“broadcast”,否则,使用“shuffle”会是更好的选择。默认情况下,我们根据实际数据大小选择方法。
auto_merge ({"both", "none", "before", "after"}, default both) –
在合并之前或之后自动合并小块
”both”: 在合并之前和之后自动合并小块,
”none”: 不合并小块
”before”: 只在合并之前合并小块
”after”: 只在合并之后合并小块
auto_merge_threshold (int, 默认值 8) – 当how为“inner”时,合并结果可能远小于原始DataFrame,如果块的数量大于阈值,它会自动合并小块。
bloom_filter_options (dict) –
“max_elements”: bloom filter中的最大元素,默认值为所有输入块的最大大小
”error_rate”: 错误率,默认 0.1。
”apply_chunk_size_threshold”: 应用于bloom filter的输入块的最小块大小,默认值为10,当左侧和右侧的块大小大于此阈值时,应用bloom filter
”filter”: “large”, “small”, “both”,默认“large”决定是对大的、小的还是两个DataFrames都进行过滤。
- Returns
合并后的两个对象的数据框。
- Return type
示例
>>> import mars.dataframe as md >>> df1 = md.DataFrame({'lkey': ['foo', 'bar', 'baz', 'foo'], ... 'value': [1, 2, 3, 5]}) >>> df2 = md.DataFrame({'rkey': ['foo', 'bar', 'baz', 'foo'], ... 'value': [5, 6, 7, 8]}) >>> df1.execute() lkey value 0 foo 1 1 bar 2 2 baz 3 3 foo 5 >>> df2.execute() rkey value 0 foo 5 1 bar 6 2 baz 7 3 foo 8
根据lkey和rkey列合并df1和df2。值列附加了默认后缀_x和_y。
>>> df1.merge(df2, left_on='lkey', right_on='rkey').execute() lkey value_x rkey value_y 0 foo 1 foo 5 1 foo 1 foo 8 2 foo 5 foo 5 3 foo 5 foo 8 4 bar 2 bar 6 5 baz 3 baz 7
合并数据框 df1 和 df2,指定的左后缀和右后缀附加到任何重叠的列。
>>> df1.merge(df2, left_on='lkey', right_on='rkey', ... suffixes=('_left', '_right')).execute() lkey value_left rkey value_right 0 foo 1 foo 5 1 foo 1 foo 8 2 foo 5 foo 5 3 foo 5 foo 8 4 bar 2 bar 6 5 baz 3 baz 7
合并数据框 df1 和 df2,但如果数据框有任何重叠的列则引发异常。
>>> df1.merge(df2, left_on='lkey', right_on='rkey', suffixes=(False, False)).execute() Traceback (most recent call last): ... ValueError: columns overlap but no suffix specified: Index(['value'], dtype='object')
>>> df1 = md.DataFrame({'a': ['foo', 'bar'], 'b': [1, 2]}) >>> df2 = md.DataFrame({'a': ['foo', 'baz'], 'c': [3, 4]}) >>> df1.execute() a b 0 foo 1 1 bar 2 >>> df2.execute() a c 0 foo 3 1 baz 4
>>> df1.merge(df2, how='inner', on='a').execute() a b c 0 foo 1 3
>>> df1.merge(df2, how='left', on='a').execute() a b c 0 foo 1 3.0 1 bar 2 NaN