问题
我有两个数据框Frame A(保存一些原始数据)和Frame B(保存阈值数据)。
我的目标是对于Frame B我想要返回的每个 id 中的相应 id 的Frame A行<= b['A']。
我写的代码工作正常,我的问题是效率。框架 B 有大约 100K 行,而框架 A 有大约 1M 行。根据快速计算,我需要大约 6 个小时来过滤我的数据。虽然 6 小时可能是可行的(我可以让它在一夜之间运行),但这个数据集代表了我数据的一小部分样本,约占我总数据集的 5%。
我试过的
import pandas as pd
from io import StringIO
data1 = """
id,A,B,C,D
123,2019-09-10 00:00:00,1,True,False
123,2019-09-10 00:10:00,1,True,False
123,2019-09-11 00:07:00,1,True,False
456,2019-09-05 01:00:00,1,True,False
456,2019-09-08 10:00:00,1,True,False
789,2019-09-10 10:00:00,1,True,False
789,2019-09-11 00:50:00,1,True,False
789,2019-09-12 12:00:00,1,True,False
"""
data2 = """
id,A,B
123,2019-09-10 00:10:00,1
456,2019-09-05 01:00:00,1
789,2019-09-12 12:00:00,1
"""
df_a = pd.read_csv(StringIO(data1))
df_b = pd.read_csv(StringIO(data2))
dfs = []
for Id in df_b.id.unique():
df = df_a[df_a.id == Id]
df = df[df['A'] <= df_b[df_b.id == Id]['A'].values[0]]
dfs.append(df)
print(pd.concat(dfs))
数据
期望的输出
id A B C D
0 123 2019-09-10 00:00:00 1 True False
1 123 2019-09-10 00:10:00 1 True False
3 456 2019-09-05 01:00:00 1 True False
5 789 2019-09-10 10:00:00 1 True False
6 789 2019-09-11 00:50:00 1 True False
7 789 2019-09-12 12:00:00 1 True False
框架 A
id A B C D
0 123 2019-09-10 00:00:00 1 True False
1 123 2019-09-10 00:10:00 1 True False
2 123 2019-09-11 00:07:00 1 True False
3 456 2019-09-05 01:00:00 1 True False
4 456 2019-09-08 10:00:00 1 True False
5 789 2019-09-10 10:00:00 1 True False
6 789 2019-09-11 00:50:00 1 True False
7 789 2019-09-12 12:00:00 1 True False
帧 B
id A B
0 123 2019-09-10 00:10:00 1
1 456 2019-09-05 01:00:00 1
2 789 2019-09-12 12:00:00 1
慕哥9229398
相关分类