最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

pandas 使用merge實現(xiàn)百倍加速的操作

 更新時間:2021年04月07日 09:15:27   作者:shywang001  
這篇文章主要介紹了pandas 使用merge實現(xiàn)百倍加速的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

對于非連續(xù)數(shù)據(jù)集,數(shù)據(jù)可視化時候需要每七天一個采樣點。要求是選擇此前最新的數(shù)據(jù)作為當日的數(shù)據(jù)展示,譬如今天是2019-06-18,而數(shù)據(jù)集里只有2019-06-15,那就用2019-06-15的數(shù)據(jù)作為2019-06-18的數(shù)據(jù)去描點。

每七天一個采樣點,會使得每天展示所選的數(shù)據(jù)都會有所不同。當時間往后推移一天,日期為2019-06-19,那么最新數(shù)據(jù)點從2019-06-19開始,第二個就是2019-06-12。這里就需要一個算法來快速的根據(jù)當前日期去選出(填充)一系列數(shù)據(jù)供數(shù)據(jù)可視化之用。

一個非常直接的實現(xiàn)方法:

先生成一串目標時間序列,從某個開始日到今天為止,每七天一個日期。

把這些日期map到數(shù)據(jù)集的日期, Eg. {“2019-06-18”:“2019-06-15”…} 。

把map到的數(shù)據(jù)抽出來用pd.concat接起來。

代碼如下:

target_dates = pd.date_range(end=now, periods=100, freq="7D")
full_dates = pd.date_range(start, now).tolist()
org_dates = df.date.tolist()

last_date = None
for d in full_dates:
 if d in org_dates:
  date_map[d] = d
  last_date = d
 elif last_date is not None:
  date_map[d] = last_date
 else:
  continue
new_df = pd.DataFrame()
for td in target_dates:
 new_df = pd.concat([new_df, df[df["date"]==date_map[td]]) 

這樣的一個算法處理一個接近千萬量級的數(shù)據(jù)集上大概需要十多分鐘。仔細檢查發(fā)現(xiàn),每一次合并的dataframe數(shù)據(jù)量并不小,而且總的操作次數(shù)達到上萬次。

所以就想如何避免高頻次地使用pd.concat去合并dataframe。

最終想到了一個巧妙的方法,只需要修改一下前面的第三步,把日期的map轉換成dataframe,然后和原始數(shù)據(jù)集做merge操作就可以了。

target_dates = pd.date_range(end=now, periods=100, freq="7D")
full_dates = pd.date_range(start, now).tolist()
org_dates = df.date.tolist()

last_date = None
for d in full_dates:
 if d in org_dates:
  date_map[d] = d
  last_date = d
 elif last_date is not None:
  date_map[d] = last_date
 else:
  continue
  
#### main change is from here #####
date_map_list = []
for td in target_dates:
 date_map_list.append({"target_date":td, "org_date":date_map[td]}) 
date_map_df = pd.DataFrame(date_map_list)
new_df = date_map_df.merge(df, left_on=["org_date"], right_on=["date"], how="inner") 

改進之后,所有的循環(huán)操作都在一個微數(shù)量級上,最后一個merge操作得到了所有有用的數(shù)據(jù),運行時間在5秒左右,大大提升了性能。

補充:Pandas DataFrames 中 merge 合并的坑點(出現(xiàn)重復連接鍵)

在我的實際開發(fā)中遇到的坑點,查閱了相關文檔 總結一下

left = pd.DataFrame({'A': [1, 2], 'B': [2, 2]})

right = pd.DataFrame({'A': [4, 5, 6], 'B': [2, 2, 2]})

result = pd.merge(left, right, on='B', how='outer')

警告:在重復鍵上加入/合并可能導致返回的幀是行維度的乘法,這可能導致內(nèi)存溢出。在加入大型DataFrame之前,重復值。

檢查重復鍵

如果知道右側的重復項DataFrame但希望確保左側DataFrame中沒有重復項,則可以使用該 validate='one_to_many'參數(shù),這不會引發(fā)異常。

pd.merge(left, right, on='B', how='outer', validate="one_to_many")
 
# 打印的結果:
 A_x B A_y
0 1 1 NaN
1 2 2 4.0
2 2 2 5.0
3 2 2 6.0

參數(shù):

validate : str, optional
If specified, checks if merge is of specified type.

“one_to_one” or “1:1”: check if merge keys are unique in both left and right datasets.
“one_to_many” or “1:m”: check if merge keys are unique in left dataset.
“many_to_one” or “m:1”: check if merge keys are unique in right dataset.
“many_to_many” or “m:m”: allowed, but does not result in checks.

官方文檔連接:

Pandas文檔中提及 merge

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關文章

  • 淺談python寫入大量文件的問題

    淺談python寫入大量文件的問題

    今天小編就為大家分享一篇淺談python寫入大量文件的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • 使用python實現(xiàn)省市三級菜單效果

    使用python實現(xiàn)省市三級菜單效果

    本文給大家分享的是使用使用python實現(xiàn)省市三級菜單效果的代碼,非常的實用,有需要的小伙伴可以參考下。
    2016-01-01
  • 詳解Python基礎random模塊隨機數(shù)的生成

    詳解Python基礎random模塊隨機數(shù)的生成

    這篇文章主要介紹了Python基礎random模塊隨機數(shù)的生成,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • 淺談Pytorch中autograd的若干(踩坑)總結

    淺談Pytorch中autograd的若干(踩坑)總結

    這篇文章主要介紹了Pytorch中autograd的若干(踩坑)總結,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • 淺析如何在Python中使用結構模式匹配

    淺析如何在Python中使用結構模式匹配

    在Python 3.10中引入了模式匹配語法,允許我們在應用程序中使用強大的新編程技術進行決策,下面我們就來講講如何在Python中使用結構模式匹配吧
    2023-08-08
  • python speech模塊的使用方法

    python speech模塊的使用方法

    這篇文章主要介紹了python speech模塊的使用方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • 動態(tài)創(chuàng)建類實例代碼

    動態(tài)創(chuàng)建類實例代碼

    Python中要創(chuàng)建一個類的實例,要首先導入該類或者該類所屬的模塊。
    2009-10-10
  • python提取字典key列表的方法

    python提取字典key列表的方法

    這篇文章主要介紹了python提取字典key列表的方法,涉及Python中keys方法的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • Python詞頻統(tǒng)計的兩種方法詳解

    Python詞頻統(tǒng)計的兩種方法詳解

    這篇文章主要為大家介紹了Python詞頻統(tǒng)計,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • python裝飾器常見使用方法分析

    python裝飾器常見使用方法分析

    這篇文章主要介紹了python裝飾器常見使用方法,結合實例形式分析了Python裝飾器的功能及三種常見的裝飾模式使用技巧,需要的朋友可以參考下
    2019-06-06

最新評論

龙里县| 伊宁市| 千阳县| 丹阳市| 赤水市| 华蓥市| 临武县| 林州市| 微山县| 夏邑县| 上饶市| 闽清县| 本溪市| 华池县| 昌宁县| 灵台县| 福贡县| 化州市| 东宁县| 岐山县| 栖霞市| 崇明县| 亚东县| 上林县| 卢湾区| 太白县| 汪清县| 桂东县| 大港区| 永丰县| 大化| 西安市| 邹平县| 长治县| 石棉县| 安平县| 什邡市| 卓尼县| 武隆县| SHOW| 永顺县|