回覆列表
  • 1 # 52sissi

      當我們使用Python進行資料分析時,有時可能需要根據DataFrame其他列中的值向pandas DataFrame新增一列。

      儘管這聽起來很簡單,但是如果我們嘗試使用if-else條件語句來做,可能會變得有些複雜。值得慶幸的是,有一種使用numpy做到這一點的簡單,好方法!

      我們將從匯入pandas和numpy開始,並載入資料集以檢視其外觀。

      我們可以看到我們的資料集包含有關每個推文的一些資訊,包括:

      1)date —推文釋出的日期

      2)time —發推文的時間

      3)tweet -該推文的實際文字

      4)mentions -推文中提及的任何其他Twitter使用者

      5)photos —推文中包含的任何影象的URL

      6)replies_count -在推文上的回覆數量

      8)likes_count —在推文上的喜歡次數

      我們還可以看到photos資料的格式有些奇怪。

      使用np.where()新增具有正確/錯誤條件的pandas列

      對於我們的分析,我們只想檢視帶有影象的推文是否獲得更多的互動,因此我們實際上不需要影象URL。讓我們嘗試建立一個名為的新列hasimage,該列將包含布林值- True如果該tweet包含影象,False則不包含影象。

      為此,我們將使用numpy的內建where()函式。此函式按順序接受三個引數:我們要測試的條件,條件為true時分配給新列的值以及條件為false時分配給新列的值。看起來像這樣:

      在我們的資料中,我們可以看到沒有影象的推文始終[]在該photos列中具有值。我們可以使用資訊並np.where()建立新列hasimage,如下所示:

      在上方,我們可以看到我們的新列已新增到我們的資料集,並且已正確標記了tweet,其中包括影象為True,其他影象為False。

      現在我們有了hasimage專欄,讓我們快速製作幾個新的DataFrame,一個用於所有影象推文,一個用於所有無影象推文。我們將使用布林過濾器進行此操作:

      現在,我們已經建立了那些,我們可以使用內建的數學函式.mean()來快速比較每個DataFrame中的推文。

      我們將使用print()語句使結果更易於閱讀。我們還需要記住使用str()來將.mean()計算結果轉換為字串,以便可以在我們的列印語句中使用它:

      新增條件更復雜的pandas專欄

      這種方法效果很好,但是如果我們想新增一個條件更復雜的新列(超出True和False的條件)怎麼辦?

      例如,為了更深入地研究這個問題,我們可能要建立一些互動性“層”,並評估到達每個層的推文所佔的百分比。為了簡單起見,讓我們使用Likes來衡量互動性,並將tweet分為四個層次:

      1)tier_4 -2個或更少的喜歡

      2)tier_3 — 3-9個贊

      3)tier_2 — 10-15個贊

      4)tier_1 — 16個贊

      為此,我們可以使用稱為的函式np.select()。我們給它兩個引數:一個條件列表,以及一個我們想要分配給新列中每一行的值的對應列表。

      這意味著順序很重要:如果conditions滿足列表中的第一個條件,則列表中的第一個值values將分配給該行的新列。大資料分析使用numpy在pandas dataframe上新增列https://www.aaa-cg.com.cn/data/2376.html如果滿足第二個條件,則將分配第二個值,等等。

      讓我們看一下它在Python程式碼中的外觀:

      太棒了!我們建立了另一個新列,該列根據我們的(雖然有些武斷)層排名系統對每個tweet進行了分類。

      現在,我們可以使用它來回答有關我們的資料集的更多問題。例如:1級和4級推文中有多少百分比具有影象?

      儘管這是一個非常膚淺的分析,但我們已經在這裡實現了我們的真正目標:根據有關現有列中值的條件語句向pandas DataFrames新增列。

      當然,這是可以以多種方式完成的任務。np.where()而np.select()只是許多潛在的兩種方法。

    https://www.toutiao.com/i6846264263237960204/

  • 2 # 機器學習之路

    答案是完全可以,除此之外,pandas還提供各種複雜的表格資料操作,我們看看下面的例子

    pandas

    pandas官網:

    https://pandas.pydata.org/

    Pandas是一個強大的分析結構化資料的工具集;它的使用基礎是Numpy(提供高效能的矩陣運算);用於資料探勘和資料分析,同時也提供資料清洗功能。pandas兩個主要的資料結構包括DataFrame和Series。

    DataFrame是Pandas中的一個表格型的資料結構,包含有一組有序的列,每列可以是不同的值型別(數值、字串、布林型等),DataFrame即有行索引也有列索引,可以被看做是由Series組成的字典。

    Series是一種類似於一維陣列的物件,是由一組資料(各種NumPy資料型別)以及一組與之相關的資料標籤(即索引)組成。僅由一組資料也可產生簡單的Series物件。

    DataFrame

    接下來我們用dataframe來實現一些對錶格的count操作

    建立一個dataframe的資料,pandas中的dataframe等價於sql中的table

    from pandas import DataFrame#建立一個表格資料,對於資料庫中的tabledata = { "id":[1,1,1,2,2,2,2,3,3], "domain":["vk.com","vk.com","twitter.com","vk.com","facebook.com", "vk.com","google.com","twitter.com","vk.com"], "age":[5,6,7,8,9,10,11,12,13]}frame = DataFrame(data)print(frame)

    統計每個domain出現的次數

    #統計name中每個名稱的個數print(frame.groupby("domain")["domain"].count())

    統計id和domain完全相同資料的個數(等價於sql中的聯合查詢)

    #聯合id和domain進行統計print(frame.groupby(["id","domain"])["domain"].count())

    統計不重複的domain

    #統計不重複domianprint(frame.domain.unique())

    統計age大於10的name

    #篩選出符合條件的dataframeprint(frame.where(frame["age"] > 10).dropna())#統計domain出現的次數print(frame.where(frame["age"] > 10).dropna().groupby("domain")["domain"].count())

    實際上pandas能做的事情還有很多很多,我這裡只是簡單的列舉了一部分而已,它還可以實現很多很複雜的操作,相對來說pandas對資料的操作要比sql操作表格簡單的多,pandas還提供了一個to_sql方法可以去操作資料庫,感興趣的同學可以去了解一下。

    我以前在部落格上寫過一些pandas的入門教程,如果有興趣更進一步瞭解可以去看看我部落格的文章

    https://blog.csdn.net/sinat_29957455/article/category/9271181

  • 3 # 番薯木魚

    下面是我的實現過程,使用df.groupby().apply(func)的方式實現的。

    df

    Out[65]:

    name Age Height Score State

    0 Jane 30 165 4.6 NY

    1 Nick 20 70 8.3 TX

    2 Aaron 22 120 9.0 FL

    3 Penelope 40 80 3.3 AL

    4 Jaane 20 162 4.0 NY

    5 Nicky 30 72 8.0 TX

    6 Armour 20 124 9.0 FL

    7 Ponting 25 81 3.0 AL

    def func(x):

    return x[x.Age==20].Age.count(), x[x.Age==30].Age.count()

    df.groupby(by=["State"]).apply(func)

    Out[64]:

    State

    AL (0, 0)

    FL (1, 0)

    NY (1, 1)

    TX (1, 1)

    dtype: object

    本來想分別返回Age==20 和 Age==30 的人數,返回兩個欄位的,但是現在只是返回了一個欄位,欄位值是一個tuple,沒有展開成兩個欄位

    找到答案了,apply的函式返回一個Series就行了

    def func(x):

    return pd.Series({"Age_20": x[x.Age==20].Age.count(), "Age_30": x[x.Age==30].Age.count()})

    df.groupby(by=["State"]).apply(func)

    Out[71]:

    Age_20 Age_30

    State

    AL 0 0

    FL 1 0

    NY 1 1

    TX 1 1

  • 中秋節和大豐收的關聯?
  • 今年核桃的長勢怎麼樣?