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

2024-09-30 02:18:48 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

当表2中的“ShipNumber”或“TrackNumber”可以在表1的“Comment”中找到时,我想合并这两个表。在

另外,我会解释原因

^{pr2}$

这种情况下不行。在

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

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

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

我希望我的问题有意义。。。 任何帮助都是非常感谢的!在

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


Tags: columns数据intablecommenttab1quantityweight
3条回答

您可以使用Whoosh这样的库为comments字段编制索引,然后对要搜索的每个装运编号进行文本搜索。在

下面是一个基于一些虚构数据的例子。别理我在数据帧里放的那些废话,我只是随便输入一些东西来获取一个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)

您可以不连接数据帧,然后创建一个助手来查看一列的字符串是否在另一列中找到。一旦有了helper列,只需过滤掉True

为什么不做点像

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)

相关问题 更多 >

    热门问题