Pandas拼接concat使用方法
1.處理索引和軸
假設(shè)我們有2個(gè)關(guān)于考試成績的數(shù)據(jù)集。
df1 = pd.DataFrame({ 'name':['A','B','C','D'], 'math':[60,89,82,70], 'physics':[66, 95,83,66], 'chemistry':[61,91,77,70] }) df2 = pd.DataFrame({ 'name':['E','F','G','H'], 'math':[66,95,83,66], 'physics':[60, 89,82,70], 'chemistry':[90,81,78,90] })
最簡單的用法就是傳遞一個(gè)含有DataFrames的列表,例如[df1, df2]
。默認(rèn)情況下,它是沿axis=0垂直連接的,并且默認(rèn)情況下會(huì)保留df1和df2原來的索引。
pd.concat([df1,df2])
如果想要合并后忽略原來的索引,可以通過設(shè)置參數(shù)ignore_index=True
,這樣索引就可以從0到n-1自動(dòng)排序了。
pd.concat([df1,df2],ignore_index = True)
如果想要沿水平軸連接兩個(gè)DataFrame
,可以設(shè)置參數(shù)axis=1
。
pd.concat([df1,df2],axis = 1)
以上是一些基本操作,我們繼續(xù)往下看。
2.避免重復(fù)索引
我們知道了concat()
函數(shù)會(huì)默認(rèn)保留原dataframe
的索引。那有些情況,我想保留原來的索引,并且我還想驗(yàn)證合并后的結(jié)果是否有重復(fù)的索引,該怎么辦呢?
可以通過設(shè)置參數(shù)verify_integrity=True
,將此設(shè)置True
為時(shí),如果存在重復(fù)的索引,將會(huì)報(bào)錯(cuò)。比如下面這樣。
try: pd.concat([df1,df2], verify_integrity=True) except ValueError as e: print('ValueError', e) ValueError: Indexes have overlapping values: Int64Index([0, 1, 2, 3], dtype='int64')
3.使用keys和names選項(xiàng)添加層次結(jié)構(gòu)索引
添加層次結(jié)構(gòu)索引非常的有用,可以進(jìn)行更多層的數(shù)據(jù)分析。
舉個(gè)例子,某些情況下我們并不想合并兩個(gè)dataframe
的索引,而是想為兩個(gè)數(shù)據(jù)集貼上標(biāo)簽。比如我們分別為df1
和df2
添加標(biāo)簽Year 1
和Year 2
。
這種情況,我們只需指定keys
參數(shù)即可。
res = pd.concat([df1,df2],keys = ['Year 1','Year 2']) res
如果我們想要獲取Year 1
的數(shù)據(jù)集,可以直接使用loc
像下面這樣操作:
res.loc['Year 1']
另外,參數(shù)names
可用于為所得的層次索引添加名稱。例如,將名稱Class
添加到剛創(chuàng)建的的標(biāo)簽上。
pd.concat( [df1,df2], keys = ['Year 1','Year 2'], names = ['Class',None], )
如果要重置索引并將其轉(zhuǎn)換為數(shù)據(jù)列,可以使用 reset_index()
,這一步操作也是非常的實(shí)用。
pd.concat( [df1, df2], keys=['Year 1', 'Year 2'], names=['Class', None], ).reset_index(level=0) # reset_index(level='Class')
4.列匹配和排序
concat()
函數(shù)還可以將合并后的列按不同順序排序。雖然,它會(huì)自動(dòng)將兩個(gè)df的列對齊合并。但默認(rèn)情況下,生成的DataFrame
與第一個(gè)DataFrame
具有相同的列排序。例如,在以下示例中,其順序與df1
相同。
如果想要按字母順序?qū)Y(jié)果DataFrame
進(jìn)行排序,則可以設(shè)置參數(shù)sort=True
。
pd.concat([df1, df2], sort=True)
或者也可以自定義排序,像下面這樣:
custom_sort = ['math', 'chemistry', 'physics', 'name'] res = pd.concat([df1, df2]) res[custom_sort]
5.連接CSV文件數(shù)據(jù)集
假設(shè)我們需要從一堆CSV文件中加載并連接數(shù)據(jù)集。常規(guī)做法,我們可能會(huì)使用for
循環(huán)解決,比如下面這樣。
import pathlib2 as pl2 ps = pl2.Path('data/sp3') res = None for p in ps.glob('*.csv'): if res is None: res = pd.read_csv(p) else: res = pd.concat([res, pd.read_csv(p)])
但上面pd.concat()
在每次for循環(huán)迭代中都會(huì)被調(diào)用一次,效率不高,推薦使用列表推導(dǎo)式的寫法。
import pathlib2 as pl2 ps = pl2.Path('data/sp3') dfs = ( pd.read_csv(p, encoding='utf8') for p in ps.glob('*.csv') ) res = pd.concat(dfs) res
這樣就可以用一行代碼讀取所有CSV文件并生成DataFrames
的列表dfs
。然后,我們只需要調(diào)用pd.concat(dfs)
一次即可獲得相同的結(jié)果,簡潔高效。
使用%%timeit
測試下上面兩種寫法的時(shí)間,第二種列表推導(dǎo)式大概省了一半時(shí)間。
# for-loop solution 298 ms ± 11.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) # list comprehension solution 153 ms ± 6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
到此這篇關(guān)于Pandas拼接concat使用方法的文章就介紹到這了,更多相關(guān)Pandas拼接concat內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- pandas的連接函數(shù)concat()函數(shù)的具體使用方法
- Python3 pandas.concat的用法說明
- pandas中DataFrame數(shù)據(jù)合并連接(merge、join、concat)
- pandas數(shù)據(jù)合并之pd.concat()用法詳解
- Pandas數(shù)據(jù)連接pd.concat的實(shí)現(xiàn)
- Python?Pandas的concat合并
- pandas.concat實(shí)現(xiàn)DataFrame豎著拼接、橫著拼接方式
- Pandas中Concat與Append的實(shí)現(xiàn)與區(qū)別小結(jié)
相關(guān)文章
python檢查目錄文件權(quán)限并修改目錄文件權(quán)限的操作
這篇文章主要介紹了python檢查目錄文件權(quán)限并修改目錄文件權(quán)限的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03Pycharm連接遠(yuǎn)程mysql報(bào)錯(cuò)的實(shí)現(xiàn)
本文主要介紹了Pycharm連接遠(yuǎn)程mysql報(bào)錯(cuò)的實(shí)現(xiàn),文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08