pandas 将df1和df2 按照姓名字段及时间字段进行连接匹配,匹配的时候df1的时间字段向前15天内的范围内去匹配df2的时间字段,最后生成的表格行数和df1相同
时间: 2024-12-24 16:39:07 浏览: 5
在Pandas中,你可以使用`merge`函数结合`pd.Timedelta`来实现这种按姓名和时间范围匹配的需求。假设df1和df2都有'姓名'和'time'字段,我们可以按照以下步骤操作:
```python
import pandas as pd
# 假设 df1 和 df2 已经加载并清洗过,time字段是datetime类型
df1 = df1.sort_values('time') # 对df1按照时间升序排序
df2 = df2.sort_values('time')
# 定义时间范围,这里是向前15天
time_range = pd.Timedelta(days=15)
# 使用 merge 函数,on='姓名'表示通过姓名字段连接,how='left'保留df1的所有行
merged_df = pd.merge(df1, df2, on='姓名', how='left',
left_on=df1['time'] - time_range,
right_on=df2['time'])
# 后续可能需要根据实际情况填充、删除或处理缺失值和不需要的数据
```
最终得到的 `merged_df` 的行数将与 df1 相同,只会有 df1 中每个姓名对应的最大15天内 df2 的数据。
相关问题
将df1和df2 按照姓名字段及时间字段进行连接匹配,匹配的时候df1的时间字段向前15天内的范围内去匹配df2的时间字段,最后生成的表格行数和df1相同
如果你想将 df1 中的每个姓名与 df2 中过去 15 天内的时间点进行连接,可以使用 Pandas 的 `merge_asof` 函数,它可以在左侧 DataFrame (df1) 的某个时间字段上查找右侧 DataFrame (df2) 的最近匹配项。以下是具体的步骤:
首先,确保 df1 和 df2 都有一个时间字段(例如 `Timestamp`),并且它们都是 datetime 类型。然后进行如下操作:
```python
import pandas as pd
# 对 df1 的 Timestamp 延长 15 天
df1['timestamp_extended'] = df1['Timestamp'].shift(-15)
# 使用 merge_asof 进行前向匹配
merged_df = pd.merge_asof(df1, df2, left_on='Name', left_index=True, right_on='Name', by='timestamp_extended', direction='forward')
# 因为 `direction='forward'`,所以合并的结果会保留 df1 的原始顺序,即 df1 时间字段往前 15 天内找到的 df2 数据
```
这将生成一个名为 `merged_df` 的 DataFrame,其行数与 df1 相同。如果在 df2 中找不到匹配,`timestamp_extended` 列对应的 df2 时间字段将显示为 NaT(Not a Time)。
pandas 假设你有两张表格,一张叫做df1,另一张叫df2,都包含姓名(Name)和时间戳(Timestamp)字段,需要对df1和df2按进行姓名和时间戳进行匹配,df1时间戳匹配的时候按前后范围15天寻找df2的时间戳
在Pandas中,你可以使用`merge`函数结合`rolling`窗口来实现这种跨表数据的匹配,假设你需要找到df1中的每个姓名在最近15天内的df2记录。以下是步骤:
1. 首先,确保两个DataFrame的索引(Timestamp列)都是日期类型,并且已经排序过。
```python
df1.set_index('Timestamp', inplace=True)
df2.set_index('Timestamp', inplace=True)
```
2. 对于df1,创建一个滚动窗口(rolling window),比如16天(包括当前天),这样可以获取到每个名字在过去的15天内的所有数据。
```python
window = df1['Timestamp'].rolling(window=16).min()
window_df = df1.join(window.rename('last_date_in_window'))
```
这里的`last_date_in_window`列包含了每个姓名在最近15天内时间戳的最小值。
3. 现在可以在df1上做一次左连接(left merge),查找df2中在这15天范围内有对应时间戳的数据。
```python
merged = pd.merge_asof(df1, df2, left_on='Timestamp', right_index=True, tolerance=pd.Timedelta(days=15))
```
`tolerance`参数设置为15天,表示允许df2的时间戳在df1指定的过去15天内。
4. 结果`merged`将是一个新的DataFrame,其中包含了df1的所有行和df2在这15天范围内的匹配记录。
阅读全文