亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 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 關注
  • 131 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號