簡體   English   中英

df.apply() 中的 pandas 錯誤僅適用於特定的 dataframe

[英]pandas error in df.apply() only for a specific dataframe

在 pandas 中發現了一些非常奇怪的東西。 我的數據框(3 行 3 列)如下所示:

在此處輸入圖像描述

當我嘗試使用下面的命令將 ID 和名稱(用下划線分隔)提取到他們自己的列時,它給了我一個錯誤:

df[['ID','Name']] = df.apply(lambda x: get_first_last(x['ID_Name']), axis=1, result_type='broadcast')

錯誤是:

ValueError: cannot broadcast result

不過,這是有趣的部分..當我從原始 dataframe 中刪除“From_To”列時,執行相同的 df.apply() 來拆分 ID_Name 工作得很好,我得到了這樣的新列: 在此處輸入圖像描述

我已經檢查了很多 SO 答案,但似乎沒有任何幫助。 我在這里錯過了什么?

PS get_first_last 是一個非常簡單的 function 像這樣:

def get_first_last(s):
    str_lis = s.split("_")
    return [str_lis[0], str_lis[1]]

來自pandas.DataFrame.apply的文檔:

'broadcast':將結果廣播到DataFrame的原始形狀,保留原始索引和列。

所以問題是你的 dataframe 的原始形狀是 (3, 3) 並且你應用 function 的結果是 2 列,所以你有一個不匹配。 這也解釋了為什么當你刪除“From_To”時,新形狀是 (3, 2),現在你有一個匹配...

您可以使用“廣播”而不是“擴展”,您將獲得預期的結果。

  table = [
      ['1_john', 23, 'LoNDon_paris'],
      ['2_bob', 34, 'Madrid_milan'],
      ['3_abdellah', 26, 'Paris_Stockhom']
  ]
  df = pd.DataFrame(table, columns=['ID_Name', 'Score', 'From_to'])
  df[['ID','Name']] = df.apply(lambda x: get_first_last(x['ID_Name']), axis=1, result_type='expand')

希望這可以幫助 !!

使用apply絕對不是一個好的用例,您應該這樣做:

df[["ID", "Name"]]=df["ID_Name"].str.split("_", expand=True, n=1)

您的數據將為 output (我只從您的數據框中取出前 2 列):

   ID_Name  Score ID   Name
0   1_john     23  1   john
1    2_bob     34  2    bob
2  3_janet     45  3  janet

現在n=1以防萬一您有多個_ (例如,作為名稱的一部分)-確保您最多返回 2 列(否則上面的代碼將失敗)

例如,如果我們稍微修改您的代碼,我們會得到以下 output:

    ID_Name  Score ID    Name
0    1_john     23  1    john
1  2_bob_jr     34  2  bob_jr
2   3_janet     45  3   janet

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM