假设我有两个数据帧,两者的列名都是:
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个条件。
答案 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等库对索引字段编制索引,然后对要搜索的每个货件号进行文本搜索。