为了账号安全,请及时绑定邮箱和手机立即绑定

在 Panda DataFrame 中过滤 groupby 数据的有效方法

在 Panda DataFrame 中过滤 groupby 数据的有效方法

蓝山帝景 2022-05-24 18:13:26
问题我有两个数据框Frame A(保存一些原始数据)和Frame B(保存阈值数据)。我的目标是对于Frame B我想要返回的每个 id 中的相应 id 的Frame A行<= b['A']。我写的代码工作正常,我的问题是效率。框架 B 有大约 100K 行,而框架 A 有大约 1M 行。根据快速计算,我需要大约 6 个小时来过滤我的数据。虽然 6 小时可能是可行的(我可以让它在一夜之间运行),但这个数据集代表了我数据的一小部分样本,约占我总数据集的 5%。我试过的import pandas as pdfrom io import StringIOdata1 = """id,A,B,C,D123,2019-09-10 00:00:00,1,True,False123,2019-09-10 00:10:00,1,True,False123,2019-09-11 00:07:00,1,True,False456,2019-09-05 01:00:00,1,True,False456,2019-09-08 10:00:00,1,True,False789,2019-09-10 10:00:00,1,True,False789,2019-09-11 00:50:00,1,True,False789,2019-09-12 12:00:00,1,True,False"""data2 = """id,A,B123,2019-09-10 00:10:00,1456,2019-09-05 01:00:00,1789,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      D0  123  2019-09-10 00:00:00  1  True  False1  123  2019-09-10 00:10:00  1  True  False3  456  2019-09-05 01:00:00  1  True  False5  789  2019-09-10 10:00:00  1  True  False6  789  2019-09-11 00:50:00  1  True  False7  789  2019-09-12 12:00:00  1  True  False框架 A   id                    A  B     C      D0  123  2019-09-10 00:00:00  1  True  False1  123  2019-09-10 00:10:00  1  True  False2  123  2019-09-11 00:07:00  1  True  False3  456  2019-09-05 01:00:00  1  True  False4  456  2019-09-08 10:00:00  1  True  False5  789  2019-09-10 10:00:00  1  True  False6  789  2019-09-11 00:50:00  1  True  False7  789  2019-09-12 12:00:00  1  True  False帧 B    id                    A  B0  123  2019-09-10 00:10:00  11  456  2019-09-05 01:00:00  12  789  2019-09-12 12:00:00  1
查看完整描述

1 回答

?
慕哥9229398

TA贡献1877条经验 获得超6个赞

使用map


s = df_a.id.map(dict(df_b[['id', 'A']].values))

df_a[df_a.A <= s]


Out[35]:

    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

使用左merge和query


(df_a.merge(df_b[['id', 'A']], on='id', how='left', suffixes=('','_y'))

     .query('A <= A_y').drop('A_y', 1))


Out[43]:

    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


查看完整回答
反对 回复 2022-05-24
  • 1 回答
  • 0 关注
  • 99 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信