Pandas DataFrames 中 merge 合并的坑点(出现重复连接键)

在我的实际开发中遇到的坑点,查阅了相关文档 总结一下

left = pd.DataFrame({'A': [1, 2], 'B': [2, 2]})

right = pd.DataFrame({'A': [4, 5, 6], 'B': [2, 2, 2]})

result = pd.merge(left, right, on='B', how='outer')

 

 警告:在重复键上加入/合并可能导致返回的帧是行维度的乘法,这可能导致内存溢出。在加入大型DataFrame之前,重复值。

检查重复键 

 如果知道右侧的重复项DataFrame但希望确保左侧DataFrame中没有重复项,则可以使用该 validate='one_to_many'参数,这不会引发异常。

pd.merge(left, right, on='B', how='outer', validate="one_to_many")

# 打印的结果:
   A_x  B  A_y
0    1  1  NaN
1    2  2  4.0
2    2  2  5.0
3    2  2  6.0

参数:

validate : str, optional
If specified, checks if merge is of specified type.

“one_to_one” or “1:1”: check if merge keys are unique in both left and right datasets.
“one_to_many” or “1:m”: check if merge keys are unique in left dataset.
“many_to_one” or “m:1”: check if merge keys are unique in right dataset.
“many_to_many” or “m:m”: allowed, but does not result in checks.
 

 官方文档连接:

Pandas文档中提及 merge

 

`pandas.merge_asof()` 是 pandas 库中的一个函数,可以根据两个 dataframes 中的时间戳列,基于最接近的时间戳将两个 dataframes 进行合并。这个函数的作用类似于 SQL 中的 `JOIN` 操作,但是可以处理时间戳列,因此非常适用于金融数据等时间序列数据的合并。 具体来说,`merge_asof()` 函数的原理是将第一个 dataframe 中的每个时间戳与第二个 dataframe 中的时间戳进行比较,然后找到最接近的时间戳,并将这两个时间戳所对应的行合并成一行。这个函数的关参数是 `on`,它指定了时间戳列的名称。 下面是一个例子,假设有两个 dataframes,df1 和 df2,它们都有一个时间戳列 date,现在要将它们合并成一个 dataframe: ```python import pandas as pd # 创建两个 dataframe df1 = pd.DataFrame({'date': pd.date_range('2020-01-01', periods=5, freq='T'), 'value': [1, 2, 3, 4, 5]}) df2 = pd.DataFrame({'date': pd.date_range('2020-01-01 00:02:30', periods=5, freq='T'), 'value': [10, 20, 30, 40, 50]}) # 使用 merge_asof() 合并两个 dataframe merged = pd.merge_asof(df1, df2, on='date') print(merged) ``` 运行结果如下: ``` date value_x value_y 0 2020-01-01 00:00:00 1 NaN 1 2020-01-01 00:01:00 2 NaN 2 2020-01-01 00:02:00 3 10.0 3 2020-01-01 00:03:00 4 20.0 4 2020-01-01 00:04:00 5 30.0 ``` 可以看到,合并后的 dataframe 中包含了两个 value 列,分别来自 df1 和 df2。其中,value_x 列来自 df1,value_y 列来自 df2。可以看到,在第一个时间戳 '2020-01-01 00:00:00' 和第二个时间戳 '2020-01-01 00:01:00' 处,df2 中并没有对应的时间戳,因此 value_y 列中对应的值为 NaN。在第三个时间戳处,df1 和 df2 中的时间戳都有,因此将它们合并到了一行中。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ch3nnn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值