亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

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

先生成一串目標(biāo)時(shí)間序列,從某個(gè)開始日到今天為止,每七天一個(gè)日期。

把這些日期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]]) 

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

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

最終想到了一個(gè)巧妙的方法,只需要修改一下前面的第三步,把日期的map轉(zhuǎn)換成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") 

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

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

在我的實(shí)際開發(fā)中遇到的坑點(diǎn),查閱了相關(guān)文檔 總結(jié)一下

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')

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

檢查重復(fù)鍵

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

pd.merge(left, right, on='B', how='outer', validate="one_to_many")
 
# 打印的結(jié)果:
 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

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

相關(guān)文章

  • Python第三方庫h5py_讀取mat文件并顯示值的方法

    Python第三方庫h5py_讀取mat文件并顯示值的方法

    今天小編就為大家分享一篇Python第三方庫h5py_讀取mat文件并顯示值的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • PyQt5學(xué)習(xí)之QThread類的使用詳解

    PyQt5學(xué)習(xí)之QThread類的使用詳解

    QThread是Qt線程類中最核心的底層類。要使用QThrea開始一個(gè)線程,可以創(chuàng)建它的一個(gè)子類,然后覆蓋其QThread.run()函數(shù)。這篇文章就來和大家聊聊QThread類的使用,感興趣的可以學(xué)習(xí)一下
    2022-12-12
  • Python實(shí)現(xiàn)冒泡排序算法的示例解析

    Python實(shí)現(xiàn)冒泡排序算法的示例解析

    冒泡排序(Bubble Sort)是一種簡(jiǎn)單的排序算法。本文將詳細(xì)為大家講講Python實(shí)現(xiàn)冒泡排序算法的方法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-06-06
  • python cookielib 登錄人人網(wǎng)的實(shí)現(xiàn)代碼

    python cookielib 登錄人人網(wǎng)的實(shí)現(xiàn)代碼

    今天晚上不是很忙,所以早早的就在電腦的旁邊開始寫東西了。我今天給大家分享一個(gè)我自己用python寫的自動(dòng)登錄 人人網(wǎng)的腳本,沒辦法就是懶!懶的輸入帳號(hào)和密碼,讓python給我們減少工作量
    2012-12-12
  • driver = webdriver.Chrome()報(bào)錯(cuò)問題及解決

    driver = webdriver.Chrome()報(bào)錯(cuò)問題及解決

    這篇文章主要介紹了driver = webdriver.Chrome()報(bào)錯(cuò)問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • python實(shí)現(xiàn)兩字符串映射

    python實(shí)現(xiàn)兩字符串映射

    這篇文章主要介紹了python實(shí)現(xiàn)兩字符串映射方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Diango + uwsgi + nginx項(xiàng)目部署的全過程(可外網(wǎng)訪問)

    Diango + uwsgi + nginx項(xiàng)目部署的全過程(可外網(wǎng)訪問)

    這篇文章主要給大家介紹了關(guān)于Diango + uwsgi + nginx項(xiàng)目部署的全過程(可外網(wǎng)訪問),文中通過示例代碼將部署的過程介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • Python時(shí)間模塊datetime、time、calendar的使用方法

    Python時(shí)間模塊datetime、time、calendar的使用方法

    這篇文章主要介紹了Python時(shí)間模塊的使用方法,主要包括三大模塊datetime、time、calendar,感興趣的小伙伴們可以參考一下
    2016-01-01
  • Python讀寫yaml文件

    Python讀寫yaml文件

    這篇文章主要介紹了Python讀寫yaml文件,yaml?是專門用來寫配置文件的語言,非常簡(jiǎn)潔和強(qiáng)大,之前用ini也能寫配置文件,有點(diǎn)類似于json格式,下面關(guān)于Python讀寫yaml文件的詳細(xì)資料,需要的小伙伴可以參考一下
    2022-03-03
  • 使用Python實(shí)現(xiàn)優(yōu)雅生成假數(shù)據(jù)

    使用Python實(shí)現(xiàn)優(yōu)雅生成假數(shù)據(jù)

    Faker是一個(gè)Python包,開源的GITHUB項(xiàng)目,主要用來創(chuàng)建偽數(shù)據(jù),這篇文章主要為大家詳細(xì)介紹了Python如何使用Faker生成假數(shù)據(jù),感興趣的小伙伴可以了解下
    2023-12-12

最新評(píng)論