主頁 > 軟體工程 > 比較和匹配不同資料框架的逗號分隔字串Pythonpandas

比較和匹配不同資料框架的逗號分隔字串Pythonpandas

2021-10-15 07:29:50 軟體工程

我想比較兩個不同資料框架中的列值,如果兩個值都匹配,就在資料框架中插入一個新的列,并在新的列中添加一個值。

DF One:

 col name col item  
 0 jo abc    
 1 bo efg   
 2 mo xyz

DF二:

 col name col item col code
 0 jo abc , xyz  123
 1 Bo efg , xyz , zyx 456
 2 mo abc, xyz 789 

我試圖比較DF One中的col_namecol_item值和DF Two中的值。如果DF One中的nameitem與DF Two中的值相匹配,則將DF Two中相應的col code值拉到DF One中。每個代碼號都被設定為一個名稱和專案。 結果應該是這樣的

DF One: 最終結果

code class="hljs language-python"> col_name col_item new_col 0 jo abc 123 1 bo efg 789 2 mo xyz 456

這是我一直在嘗試的代碼。我的邏輯是,如果DF Two的名字和專案與DF One的名字和專案相匹配,就把DF Two的col code值拉到DF One

if df_two[' col name '] == df_one[' col name '] & df_two [' col item '] == df_one[' col item ']。
    df_one['new col'] = df_two['col code'].

df_one.head(5).to_dict

{'Date': {0: '8/24/2021',
   1: '8/17/2021',
   2: '8/19/2021',
   3: '8/19/2021',
   4: '8/19/2021'}。
  'ID Number': {0: 123213,
   1: 4564564' 。
   2: '789789'。
   3: '735764',
   4: '1010101'}。}
  'col name': {0: 'mo',
   1: 'bo',
   2: 'jo,LLP',
   3: 'do, LLP',
   4: 'to, LLP'},
  'Amount': {0: 900.0, 1: 105.0, 2: 1.02, 3: 132.0, 4: 8.0},
  '稅金': {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0},
  'col item': {0: ' abc - bc - zxy ',
   1: ' cba - abc - zx ',
   2: ' hij ',
   3: ' lmn - op - xyz',
   4: ' lmn - ac - mno'},
  'BBNumber': {0: '30, 1: '30', 2: '30', 3: '30', 4: '30'}。}

df_two.head(5).to_dict

{'Unnamed: 0'/span>: {0: 0, 1: 1, 2: 2, 3: 3, 4: 4}。
  'col name'/span>: {0: 'mo',
   1: 'bo'2: 'jo,LLP',
   3: 'do, LLP',
   4: 'to, LLP'}。
  'col code'/span>: {0: 123, 1: 456, 2: 789, 3: 987, 4: 654}。
  'col item'/span>: {0: ' abc - bc - zxy, lmn - ac - mno, cba',
   1: cba - abc - zx, lmn - op - xyz',
   2: 'hij , qrx'3: 'lmn - op - xyz, abc',
   4: 'lmn - ac - mno'}}.

uj5u.com熱心網友回復:

你可以嘗試通過str.split()df_twocol_item的字串分割成串列,然后使用.explode()來創建行,串列中每項都在一個行。 然后,我們.merge()df_one在這2列上。 最后,通過.rename()將列col_code重命名為new_col,如下所示:

<
df2a = df_two.assign(col_item=df_two['col_item'/span>]。 str.split(r's*,s*')).explode('col_item')

(df_one.merge(df2a, on=['col_name', 'col_item'] )
       .重命名({'col_code': 'new_col'}, axis=1)
)

結果:

 col_name col_item new_col
0 jo abc 123
1 bo efg 789
2 mo xyz 456

編輯

這里是一個沒有使用.assign()的版本:

df2a = df_two.copy()
df2a['col_item'] = df2a['col_item'].str.split(r's*,s*')
df2a = df2a.explode('col_item')

(df_one.merge(df2a, on=['col_name', 'col_item'] )
       .重命名({'col_code': 'new_col'}, axis=1)
)

編輯2

正如你通過to_dict()的資料集轉儲所顯示的那樣,你在源資料幀df_onedf_two中列col item中的字串實際上包含一些前導和/或尾部空格。 這就是為什么這兩個資料幀中的一些字串不能成功匹配的原因。

例如,在df_one中,你有字串' abc - bc - zxy '(兩端都有空格),而從df_two中,你有字串' abc - bc - zxy, lmn - ac - mno, cba'(逗號之前的第一部分只有一個空格,而逗號之前沒有空格)。因此,如果不剝離兩端多余的白色空格,我們就無法匹配這些字串。

下面是修改后的代碼,其中包括為兩個資料框架的列col item剝離兩端多余的空白的代碼:

df2a = df_two.copy()
df2a['col item'] = df2a['col item'].str.split(r's*,s*')
df2a = df2a.explode('col item')
df2a['col item'] = df2a['col item'].str.strip() # 剝離兩端多余的白空間。

df1a = df_one.copy()
df1a['col item'] = df1a['col item'].str.strip() # 剝離兩端多余的白色空間。

df_out = (df1a.merge(df2a, on=['col name', 'col item'] )
              .重命名({'col code': 'new_col'}, axis=1)
         )

資料輸入

(在你的to_dict()資料轉儲中糾正了一些錯字)

d1 = {'Date'/span>: {0: '8/24/2021', 1: '8/17/2021', 2: '8/19/2021', 3: '8/19/2021', 4: '8/19/2021'}。
  'ID Number': {0: '123213', 1: '4564564', 2: '789789', 3: '735764', 4: '1010101'}。
  'col name': {0: 'mo', 1: 'bo',  2: 'jo,LLP', 3: 'do, LLP', 4: 'to, LLP'}。
  '金額': {0: 900.0, 1: 105.0, 2: 1.02, 3: 132.0, 4: 8.0}。
  'Tax': {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0}。
  'col item': {0: ' abc - bc - zxy ', 
               1: ' cba - abc - zx ', 
               2: ' hij ', 
               3: ' lmn - op - xyz'4: ' lmn - ac - mno'}。
  'BBNumber'/span>: {0: '30', 1: '30', 2: '30', 3: '30', 4: '30'}}}。
df_one = pd.DataFrame(d1)

        日期 身份證號碼 欄目名稱 金額 稅收 欄目專案 BBNumber
0 8/24/2021 123213900. 00 0.0 abc - bc - zxy 30.
1 8/17/2021 4564564 bo 105。 00 0.0 cba - abc - zx 30.
2 8/19/2021 789789 jo,LLP 1。 02 0.0 hij 30
3 8/19/2021 735764 do, LLP 132. 00 0.0 lmn - op - xyz 30.
4 8/19/2021 1010101 to, LLP 8。 00 0.0 lmn - ac - mno 30.
d2 = {'Unnamed: 0'/span>: {0: 0, 1: 1, 2: 2, 3: 3, 4: 4}。
  'col name'/span>: {0: 'mo', 1: 'bo',  2: 'jo,LLP', 3: 'do, LLP', 4: 'to, LLP'}。
  'col code'/span>: {0: 123, 1: 456, 2: 789, 3: 987, 4: 654}。
  'col item'/span>: {0: ' abc - bc - zxy, lmn - ac - mno, cba', 
               1: 'cba - abc - zx, lmn - op - xyz'2: 'hij , qrx', 
               3: ' lmn - op - xyz, abc', 
               4: 'lmn - ac - mno'}}}
df_two = pd.DataFrame(d2)

   未命名。0 col name col code col item
0 0 mo 123 abc - bc - zxy, lmn - ac - mno, cba
1 1 bo 456 cba - abc - zx, lmn - op - xyz
2 2 jo, LLP 789 hij , qrx
3 3 do, LLP 987 lmn - op - xyz, abc
4 4 to, LLP 654 lmn - ac - mno

注意,在你的源資料框架中已經有一個列 Unnamed: 0。 它不是通過運行解決方案的代碼引入的。

輸出

print(df_out)


        日期 身份證號碼 欄目名稱 金額 欄目專案 BBNumber 未命名。0 new_col
0 8/24/2021 123213900. 00 0.0 abc - bc - zxy 30 0 123
1 8/17/2021 4564564 bo 105。 00 0.0 cba - abc - zx 30 1 456
2 8/19/2021 789789 jo, LLP 1. 02 0.0 hij 30 2 789
3 8/19/2021 735764 do, LLP 132。 00 0.0 lmn - op - xyz 30 3 987
4 8/19/2021 10101 to, LLP 8。 00 0.0 lmn - ac - mno 30 4 654

你也可以只提取部分結果列,例如:

你也可以只提取部分結果列。

df_out2 = df_out[['col name', 'col item', 'new_col']]

結果:

print(df_out2)。

  欄目名稱 欄目專案 new_col
0 mo abc - bc - zxy123
1 bo cba - abc - zx 456
2 jo,LLP hij789
3 do, LLP lmn - op - xyz 987
4 to, LLP lmn - ac - mno 654

uj5u.com熱心網友回復:

如果你想在現有的資料框架中添加一個新的列,你需要使用assign,它將添加一個pandas系列作為一個新的列。另外,輸出的 df_two [' col_item '] == df_one[' col_item ']/code>

應該是

0 False
1 False
2 False
名稱:col_item,dtype。bool

你所比較的列的形狀是相同的。

uj5u.com熱心網友回復:

import pandas as pd

df1 = pd. DataFrame({'col_name': ["jo", "bo", "mo"], 'col_item': ['abc'/span>, 'efg'/span>, 'xyz'/span>]})
df2 = pd. DataFrame({'col_name': ["jo", "bo"], 'col_item': ["abc,xyz", "efg,xyz,zyx"], 'col_code'/span>: ["123"/span>, "456"/span>]})

print(df1)
print(df2)
  • 你應該將這兩個框架合并到共同的列上。See https://stackoverflow.com/a/53645883/496289.

     df3 = df1.merge(df2, on='col_name')
      print(df3)
    
  • 洗掉不需要的行。

    def is_col1_in_col2row)。 return row.col_item_x in row.col_item_y df4 = df3[df3.apply(is_col1_in_col2, axis=1) ] print(df4)

  • 洗掉不需要的列。

    df5 = df4.drop('col_item_y', 1) 。 rename(columns={'col_item_x':'col_item'}) print(df5)

<小時

輸出:

df1
   col_name col_item
0 jo abc
1 bo efg
2 mo xyz

df2
   col_name col_item col_code
0 jo abc,xyz123
1bo efg,xyz,zyx 456

df3
   col_name col_item_x col_item_y col_code
0 jo abc abc,xyz123
1 bo efg efg,xyz,zyx 456

df4
   col_name col_item_x col_item_y col_code
0 jo abc abc,xyz123
1 bo efg efg,xyz,zyx 456

df5
   col_name col_item col_code
0 jo abc123
1 Bo efg 456

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/314857.html

標籤:

上一篇:處理檔案

下一篇:變數不能存盤資料的Javascript

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more