<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python!要這樣寫(xiě)!

          共 4155字,需瀏覽 9分鐘

           ·

          2021-10-13 14:54

          作者:Frank Andrade,譯者:張峰


          眾所周知,編寫(xiě)Python代碼在開(kāi)始時(shí)十分容易,但隨著你在工具包中添加更多的庫(kù),你的腳本可能會(huì)有不必要的代碼行,變得冗長(zhǎng)而混亂。可能短期內(nèi)能夠應(yīng)付工作,但長(zhǎng)期來(lái)看,麻煩不小。

          在這篇文章中,我將與你分享7個(gè)技巧,使你在使用Python進(jìn)行數(shù)據(jù)科學(xué)時(shí)更加簡(jiǎn)潔。這涵蓋了我們?nèi)粘K龅氖虑椋缧薷腜andas數(shù)據(jù)框中的值,連接字符串,讀取文件等操作!

          1. 使用Lambda來(lái)修改Pandas數(shù)據(jù)框中的值

          假設(shè)我們有以下df數(shù)據(jù)框:

          data?=?[[1,2,3],?[4,5,6],?[7,8,9]]
          df?=?pd.DataFrame(data,?columns=[0,1,2])
          IN[1]:?print?(df)
          OUT[1]:????0??1??2
          ????????0??1??2??3
          ????????1??4??5??6
          ????????2??7??8??9

          現(xiàn)在由于某種原因,你需要在第0列的數(shù)字上添加01的值。一個(gè)常見(jiàn)的方法是定義一個(gè)函數(shù)來(lái)完成這個(gè)任務(wù),然后用 apply 函數(shù)來(lái)修改一列的值。

          def?add_numbers(x):
          ????return?f'{x}01'
          df[0]?=?df[0].apply(add_numbers)
          IN[1]:?print?(df)
          OUT[1]:?????0???1???2
          ????????0??101??2???3
          ????????1??401??5???6
          ????????2??701??8???9

          這并不復(fù)雜,但是在數(shù)據(jù)框中對(duì)每一個(gè)改變創(chuàng)建一個(gè)函數(shù)是不切實(shí)際的。這時(shí)lambda就派上了用場(chǎng)。

          lambda函數(shù)類(lèi)似于普通的Python函數(shù),但它可以不使用名稱(chēng)來(lái)定義,這使得它成為一個(gè)漂亮的單行代碼。之前使用的代碼可以用以下方式來(lái)減少。

          df[0]?=?df[0].apply(lambda?x:f'{x}01')

          當(dāng)你不知道是否可以訪(fǎng)問(wèn)一個(gè)系列的屬性來(lái)修改數(shù)據(jù)時(shí),Lambda變得非常有用。

          例如,列0包含字母,我們想把它們大寫(xiě)。

          #?如果你知道.str的存在,你可以這樣做
          df[0]?=?df[0].str.title()
          #?如果你不知道.str,你仍然可以用lambda大寫(xiě)
          df[0]?=?df[0].apply(lambda?x:?x.title())

          2. 使用f-string來(lái)連接字符串

          字符串連接是Python中非常常見(jiàn)的操作,它可以用不同的方法來(lái)完成。最常見(jiàn)的方法是使用+運(yùn)算符;然而,這個(gè)運(yùn)算符的一個(gè)問(wèn)題是我們不能在字符串之間添加任何分隔符。

          當(dāng)然,如果你想把 "Hello "和 "World "連接起來(lái),一個(gè)典型的變通方法是添加一個(gè)空白分隔符(" ")。

          print("Hello"?+?"?"?+?"World")

          這就完成了工作,但為了寫(xiě)出更可讀的代碼,我們可以用一個(gè)f-string來(lái)代替它。

          IN[2]:?print(f'{Hello}?{World}')
          OUT[2]:?"Hello?World"

          在一個(gè)基本的例子中,這似乎是不必要的,但是當(dāng)涉及到連接多個(gè)值時(shí)(正如你將在提示#3中看到的),f-string將使你免于書(shū)寫(xiě)多次+ " " +。我不知道過(guò)去有多少次不得不寫(xiě)+運(yùn)算符,但現(xiàn)在不會(huì)了!

          其他連接字符串的方法是使用join()方法或format()函數(shù),然而f-string在字符串連接方面做得更好。

          3. 用Zip()函數(shù)對(duì)多個(gè)列表進(jìn)行迭代

          你是否曾經(jīng)想在 Python 中循環(huán)遍歷一個(gè)以上的列表?當(dāng)你有兩個(gè)列表時(shí),你可以用 enumerate 來(lái)實(shí)現(xiàn)。

          teams?=?['Barcelona',?'Bayern?Munich',?'Chelsea']
          leagues?=?['La?Liga',?'Bundesliga',?'Premiere?League']
          for?i,?team?in?enumerate(teams):
          ????league?=?leagues[i]
          ????print(f'{team}?plays?in?{league}')

          然而,當(dāng)你有兩個(gè)或更多的列表時(shí),這變得不切實(shí)際。一個(gè)更好的方法是使用zip()函數(shù)。zip()函數(shù)接收迭代數(shù)據(jù),將它們聚集在一個(gè)元組中,并返回之。

          讓我們?cè)僭黾右粋€(gè)列表,看看zip()的威力!

          teams?=?['Barcelona',?'Bayern?Munich',?'Chelsea']
          leagues?=?['La?Liga',?'Bundesliga',?'Premiere?League']
          countries?=?['Spain',?'Germany',?'UK']
          for?team,?league,?country?in?zip(teams,?leagues,?countries):
          ????print(f'{team}?plays?in?{league}.?Country:?{country}')

          上述代碼的輸出結(jié)果為:

          Barcelona?plays?in?La?Liga.?Country:?Spain
          Bayern?Munich?plays?in?Bundesliga.?Country:?Germany
          Chelsea?plays?in?Premiere?League.?Country:?UK

          此處你注意到我們?cè)谶@個(gè)例子中使用了f-string嗎?代碼變得更有可讀性,不是嗎?

          4. 使用列表理解法

          清洗和處理數(shù)據(jù)的一個(gè)常見(jiàn)步驟是修改現(xiàn)有的列表。比如,我們有以下需要大寫(xiě)的列表:

          words?=?['california',?'florida',?'texas']

          將words列表的每個(gè)元素大寫(xiě)的典型方法是創(chuàng)建一個(gè)新的大寫(xiě)列表,執(zhí)行一次 for 循環(huán),使用.title(),然后將每個(gè)修改的值附加到新的列表中。

          capitalized?=?[]
          for?word?in?words:
          ????capitalized.append(word.title())

          然而,Pythonic的方法是使用列表理解來(lái)做到這一點(diǎn)。列表理解有一種優(yōu)雅的方法來(lái)制作列表。

          你可以用一行代碼重寫(xiě)上面的for循環(huán):

          capitalized?=?[word.title()?for?word?in?words]

          由此我們可以跳過(guò)第一個(gè)例子中的一些步驟,結(jié)果是一樣的。

          5. 對(duì)文件對(duì)象使用with語(yǔ)句

          當(dāng)在一個(gè)項(xiàng)目上工作時(shí),我們經(jīng)常會(huì)對(duì)文件進(jìn)行讀寫(xiě)操作。最常見(jiàn)的方法是使用open()函數(shù)打開(kāi)一個(gè)文件,它會(huì)創(chuàng)建一個(gè)我們可以操作的文件對(duì)象,然后作為一個(gè)習(xí)慣的做法,我們應(yīng)該使用close()關(guān)閉該文件對(duì)象。

          f?=?open('dataset.txt',?'w')
          f.write('new_data')
          f.close()

          這很容易記住,但有時(shí)寫(xiě)了幾個(gè)小時(shí)的代碼,我們可能會(huì)忘記用f.close()關(guān)閉f文件。這時(shí),with語(yǔ)句就派上了用場(chǎng)。with語(yǔ)句將自動(dòng)關(guān)閉文件對(duì)象f,形式如下:

          with?open('dataset.txt',?'w')?as?f:
          ????f.write('new_data')

          有了這個(gè),我們可以保持代碼的簡(jiǎn)短。

          你不需要用它來(lái)讀取CSV文件,因?yàn)槟憧梢杂胮andas的 pd.read_csv()輕松地讀取,但在讀取其他類(lèi)型的文件時(shí),這仍然很有用。例如,從pickle文件中讀取數(shù)據(jù)時(shí)經(jīng)常使用它。

          import?pickle?
          #?從pickle文件中讀取數(shù)據(jù)集
          with?open(‘test’,?‘rb’)?as?input:
          ????data?=?pickle.load(input)

          6. 停止使用方括號(hào)來(lái)獲取字典項(xiàng), 利用.get()代替

          比如,有以下一個(gè)字典:

          person?=?{'name':?'John',?'age':?20}

          我們可以通過(guò)person[name]person[age]分別獲得姓名和年齡。但是,由于某種原因,我們想獲得一個(gè)不存在的鍵,如 "工資",運(yùn)行person[salary]會(huì)引發(fā)一個(gè)`KeyError'。

          這時(shí),get()方法就有用了。如果鍵在字典中,get()方法返回指定鍵的值,但是如果沒(méi)有找到鍵,Python 將返回None。得益于此,你的代碼不會(huì)中斷。

          person?=?{'name':?'John',?'age':?20}
          print('Name:?',?person.get('name'))
          print('Age:?',?person.get('age'))
          print('Salary:?',?person.get('salary'))

          輸出結(jié)果如下:

          Name:??John
          Age:??20
          Salary:??None

          7. 多重賦值

          你是否曾想減少用于創(chuàng)建多個(gè)變量、列表或字典的代碼行數(shù)?那么,你可以用多重賦值輕松做到這一點(diǎn)。

          #?原始操作
          a?=?1
          b?=?2
          c?=?3
          #?替代操作
          a,?b,?c?=?1,?2,?3
          #?代替在不同行中創(chuàng)建多個(gè)列表
          data_1?=?[]
          data_2?=?[]
          data_3?=?[]
          data_4?=?[]
          #?可以在一行中創(chuàng)建它們的多重賦值
          data_1,?data_2,?data_3,?data_4?=?[],?[],?[],?[]
          #?或者使用列表理解法
          data_1,?data_2,?data_3,?data_4?=?[[]?for?i?in?range(4)]

          原文鏈接:

          https://towardsdatascience.com/7-tips-to-level-up-your-python-code-for-data-science-4a64dbccd86d

          ·················END·················

          推薦閱讀

          1. 我在字節(jié)做了哪些事

          2. 寫(xiě)給所有數(shù)據(jù)人。

          3. 從留存率業(yè)務(wù)案例談0-1的數(shù)據(jù)指標(biāo)體系

          4. 數(shù)據(jù)分析師的一周

          5. 超級(jí)菜鳥(niǎo)如何入門(mén)數(shù)據(jù)分析?


          歡迎長(zhǎng)按掃碼關(guān)注「數(shù)據(jù)管道」

          瀏覽 58
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  www.日韩AV | 亚洲午夜久影院 | 亚洲中文字幕成人影视 | 国产做受91 一片二片老头 | 黄片成人网站 |