猿问

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

问题


我有两个数据框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


蓝山帝景
浏览 100回答 1
1回答

慕哥9229398

使用maps = df_a.id.map(dict(df_b[['id', 'A']].values))df_a[df_a.A <= s]Out[35]:&nbsp; &nbsp; id&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;A&nbsp; B&nbsp; &nbsp; &nbsp;C&nbsp; &nbsp; &nbsp; D0&nbsp; 123 2019-09-10 00:00:00&nbsp; 1&nbsp; True&nbsp; False1&nbsp; 123 2019-09-10 00:10:00&nbsp; 1&nbsp; True&nbsp; False3&nbsp; 456 2019-09-05 01:00:00&nbsp; 1&nbsp; True&nbsp; False5&nbsp; 789 2019-09-10 10:00:00&nbsp; 1&nbsp; True&nbsp; False6&nbsp; 789 2019-09-11 00:50:00&nbsp; 1&nbsp; True&nbsp; False7&nbsp; 789 2019-09-12 12:00:00&nbsp; 1&nbsp; True&nbsp; False使用左merge和query(df_a.merge(df_b[['id', 'A']], on='id', how='left', suffixes=('','_y'))&nbsp; &nbsp; &nbsp;.query('A <= A_y').drop('A_y', 1))Out[43]:&nbsp; &nbsp; id&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;A&nbsp; B&nbsp; &nbsp; &nbsp;C&nbsp; &nbsp; &nbsp; D0&nbsp; 123 2019-09-10 00:00:00&nbsp; 1&nbsp; True&nbsp; False1&nbsp; 123 2019-09-10 00:10:00&nbsp; 1&nbsp; True&nbsp; False3&nbsp; 456 2019-09-05 01:00:00&nbsp; 1&nbsp; True&nbsp; False5&nbsp; 789 2019-09-10 10:00:00&nbsp; 1&nbsp; True&nbsp; False6&nbsp; 789 2019-09-11 00:50:00&nbsp; 1&nbsp; True&nbsp; False7&nbsp; 789 2019-09-12 12:00:00&nbsp; 1&nbsp; True&nbsp; False
随时随地看视频慕课网APP

相关分类

Python
我要回答