我想比較兩個不同資料框架中的列值,如果兩個值都匹配,就在資料框架中插入一個新的列,并在新的列中添加一個值。
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_name和col_item值和DF Two中的值。如果DF One中的name和item與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_two中col_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_one和df_two中列col item中的字串實際上包含一些前導和/或尾部空格。 這就是為什么這兩個資料幀中的一些字串不能成功匹配的原因。
例如,在 下面是修改后的代碼,其中包括為兩個資料框架的列 資料輸入 (在你的 注意,在你的源資料框架中已經有一個列 輸出 你也可以只提取部分結果列,例如: 你也可以只提取部分結果列。
結果: uj5u.com熱心網友回復: 如果你想在現有的資料框架中添加一個新的列,你需要使用assign,它將添加一個pandas系列作為一個新的列。另外,輸出的
應該是 你所比較的列的形狀是相同的。 uj5u.com熱心網友回復: 你應該將這兩個框架合并到共同的列上。See https://stackoverflow.com/a/53645883/496289. 洗掉不需要的行。 洗掉不需要的列。 輸出:
標籤: 上一篇:處理檔案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 123213 莫 900. 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 123213 莫 900. 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
df_two [' col_item '] == df_one[' col_item ']/code>0 False
1 False
2 False
名稱:col_item,dtype。bool
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)
<小時
df3 = df1.merge(df2, on='col_name')
print(df3)
def is_col1_in_col2(row)。
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
