2017-08-25 79 views
1

比方說,我有兩個dataframes,並同時爲列名:python熊貓如何根據子串合併/連接兩個表?

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

我想合併兩個表時是「ShipNumber」或從表2「軌段編號」可以在「評論」中找到從表1

而且,我會解釋爲什麼

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

不會在這種情況下工作。

「註釋」列是可以包含任何內容的文本塊,因此我無法進行類似tab2.ShipNumber == tab1.Comment的精確匹配,因爲tab2.ShipNumber或tab2.TrackNumber可以作爲子字符串tab1.Comment。

所需的輸出表應具有的所有獨特的列從兩個表:

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

我希望我的問題是有道理的...... 任何幫助,真的很感謝!

的最終目標是與合併兩套(shipnumber == shipnumber |軌段編號==軌段編號| shipnumber在評論|評論中軌段編號),但我已經創建了兩個子集爲前兩個條件,現在我正在處理第三和第四個條件。

+0

你可以在''Comment''列上使用正則表達式來創建一個新的'ExtractedNum'列來匹配看起來像ShipNumber或TrackNumber的東西嗎?然後你可以合併新的ExtractedNum列。或者評論中可能有多於一個的數字? – nanojohn

+0

ShipNumber和TrackNumber可能不會保持相同的格式....(少數例外存在,不想排除這些)。所以這就是爲什麼我想只匹配來源(表2)。和'評論'是一個文本的一塊可以是任何東西。 – alwaysaskingquestions

回答

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) 

不是加入相反,你可以conatenate的dataframes,然後創建一個幫手,看看一列字符串中的另一個發現。一旦你有了這個幫手列,只需過濾掉True即可。

+0

這不起作用;抱歉沒有明確提出我的問題。我現在編輯我的問題。 – alwaysaskingquestions

+0

基本上,「註釋」是一個長字符串,但是shipnumber可以是包含在「註釋」字符串中的子字符串。因此不能像這樣使用合併功能。 – alwaysaskingquestions

+0

我不確定是否有方法可以加入函數調用 - 也許將df連接在一起,然後創建一個輔助列,其中包含're.search'或簡單的'trackingnum in Comment或shipnumber in comment'。之後,您可以像正常情況下那樣過濾df,以確保該幫助列是真實的。 – Solaxun

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) 
0

,你可以使用索引像Whoosh庫中的註釋字段,然後做你想要通過搜索每次發貨數量文本搜索。