我正在合并一些有时间索引的数据帧.
import pandas as pd
df1 = pd.DataFrame(['a', 'b', 'c'],
columns=pd.MultiIndex.from_product([['target'], ['key']]),
index = [
'2022-04-15 20:20:20.000000',
'2022-04-15 20:20:21.000000',
'2022-04-15 20:20:22.000000'],)
df2 = pd.DataFrame(['a2', 'b2', 'c2', 'd2', 'e2'],
columns=pd.MultiIndex.from_product([['feature2'], ['keys']]),
index = [
'2022-04-15 20:20:20.100000',
'2022-04-15 20:20:20.500000',
'2022-04-15 20:20:20.900000',
'2022-04-15 20:20:21.000000',
'2022-04-15 20:20:21.100000',],)
df3 = pd.DataFrame(['a3', 'b3', 'c3', 'd3', 'e3'],
columns=pd.MultiIndex.from_product([['feature3'], ['keys']]),
index = [
'2022-04-15 20:20:19.000000',
'2022-04-15 20:20:19.200000',
'2022-04-15 20:20:20.000000',
'2022-04-15 20:20:20.200000',
'2022-04-15 20:20:23.100000',],)
然后我使用这个合并过程:
def merge(dfs:list[pd.DataFrame], targetColumn:'str|tuple[str]'):
from functools import reduce
if len(dfs) == 0:
return None
if len(dfs) == 1:
return dfs[0]
for df in dfs:
df.index = pd.to_datetime(df.index)
merged = reduce(
lambda left, right: pd.merge(
left,
right,
how='outer',
left_index=True,
right_index=True),
dfs)
for col in merged.columns:
if col != targetColumn:
merged[col] = merged[col].fillna(method='ffill')
return merged[merged[targetColumn].notna()]
这样地:
merged = merge([df1, df2, df3], targetColumn=('target', 'key'))
这就产生了:
一切都很好.问题是效率——请注意,在merge()过程中,我使用reduce和外部merge将数据帧连接在一起,这会生成一个巨大的临时数据帧,然后被过滤掉.但是如果我的电脑没有足够的内存来处理内存中的巨 Big Data 帧呢?这就是我想要避免的问题.
我想知道是否有办法避免在合并时将数据扩展成一个巨大的数据帧.
当然,常规的旧合并是不够的,因为它只在完全匹配的索引上进行合并,而不是在目标变量观察之前的最新时间索引上进行合并:
df1.merge(df2, how='left', left_index=True, right_index=True)
这类问题得到有效解决了吗?这似乎是一个常见的数据科学问题,因为没有人想将future 的信息泄露到他们的模型中,每个人都有各种各样的输入来合并在一起...