python pandas如何基于子字符串合并/连接两个表?

时间:2017-08-25 21:07:22

标签: python pandas

假设我有两个数据帧,两者的列名都是:

table 1 columns:
[ShipNumber, TrackNumber, Comment, ShipDate, Quantity, Weight]
table 2 columns:
[ShipNumber, TrackNumber, AmountReceived]

我希望在表1的“注释”中找到表2中的“ShipNumber”或“TrackNumber”时合并这两个表。

另外,我会解释原因

merged = pd.merge(df1,df2,how='left',left_on='Comment',right_on='ShipNumber')

在这种情况下不起作用。

“Comment”列是一个可以包含任何内容的文本块,因此我无法像tab2.ShipNumber == tab1.Comment那样进行完全匹配,因为tab2.ShipNumber或tab2.TrackNumber可以在tab1中找到子字符串。评论。

所需的输出表应包含两个表中的所有唯一列:

output table column names:
[ShipNumber, TrackNumber, Comment, ShipDate, Quantity, Weight, AmountReceived]

我希望我的问题有道理...... 任何帮助真的很感激!

注意

最终目标是将两个集合合并(shipnumber == shipnumber | tracknumber == tracknumber | shipnumber in comments | tracknumber in comments),但我为前两个创建了两个子集条件,现在我正在研究第3和第4个条件。

3 个答案:

答案 0 :(得分:0)

这是一个基于一些组成数据的例子。忽略我在数据框中放入的完全废话,我只是输入随机的东西来获取样本df。

import pandas as pd
import re

x = pd.DataFrame({'Location': ['Chicago','Houston','Los Angeles','Boston','NYC','blah'],
                  'Comments': ['chicago is winter','la is summer','boston is winter','dallas is spring','NYC is spring','seattle foo'],
                  'Dir':      ['N','S','E','W','S','E']})

y = pd.DataFrame({'Location': ['Miami','Dallas'],
                  'Season':   ['Spring','Fall']})


def findval(row):
    comment, location, season = map(lambda x: str(x).lower(),row)
    return location in comment or season in comment

merged = pd.concat([x,y])

merged['Helper'] = merged[['Comments','Location','Season']].apply(findval,axis=1)
print(merged)
filtered = merged[merged['Helper'] == True]
print(filtered)

您可以连接数据框,然后创建一个帮助程序,以查看是否在另一个列中找到了一列的字符串,而不是加入。获得帮助列后,只需过滤掉True。

答案 1 :(得分:0)

为什么不做像

这样的事情
Count = 0
def MergeFunction(rowElement):
    global Count
    df2_row = df2.iloc[[Count]]
    if(df2_row['ShipNumber'] in rowElement['Comments'] or df2_row['TrackNumber'] 
       in rowElement['Comments']
    rowElement['Amount'] = df2_row['Amount']
    Count+=1
    return rowElement

df1['Amount'] = sparseArray #Fill with zeros
new_df = df1.apply(MergeFunction)

答案 2 :(得分:0)

您可以使用Whoosh等库对索引字段编制索引,然后对要搜索的每个货件号进行文本搜索。