合并数据 - 方法总结(concat、append、merge、join、combine_first)- Python代码
描述
分析一個業(yè)務(wù)的時候往往涉及到很多數(shù)據(jù),比如企業(yè)融資信息、投資機(jī)構(gòu)信息、行業(yè)標(biāo)簽、招聘數(shù)據(jù)、政策數(shù)據(jù)等,這些數(shù)據(jù)分別存儲在不同的表中。通過堆疊合并和主鍵合并等多種合并方式,可以將這些表中需要的數(shù)據(jù)信息合并在一張表中供分析使用。
合并方法
堆疊合并
堆疊合并就是簡單的把兩個表拼在一起,分為橫向堆疊和縱向堆疊。
橫向堆疊
橫向堆疊就是指將后一個表的數(shù)據(jù)堆疊到前一個表的后幾列,可以使用 concat 函數(shù)完成。
concat 函數(shù)基本語法
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,keys=None, levels=None, names=None, verify_integrity=False,copy=True)objs:表示需要合并的表的組合[d1, d2],接收多個Series, DataFrame, Panel 的組合,無默認(rèn);
axis:默認(rèn)為0,axis=0表示做列對齊,列名一致的話,將后表數(shù)據(jù)添加到前表的下幾行;
? ? ? ? ? ? ? ? ? ? ? ? ? axis=1表示做行對齊,行標(biāo)簽一致的話,將后表的數(shù)據(jù)添加到前表的后幾列;
join:默認(rèn)為outer,接收‘inner’或‘outer’,表示取交集或并集;
其他參數(shù)相對不是那么常用,有興趣的可以參考:concat函數(shù)的常用參數(shù)及說明
Python代碼
# -*- coding=utf-8 -*- import pandas as pd import numpy as np from pandas import DataFrame,Series import math#導(dǎo)入數(shù)據(jù) eventfile = u'D:\\pythondata\\yuchuli\\event.xlsx'#投融資事件 event = pd.read_excel(eventfile) event = DataFrame(event)eventbufile = u'D:\\pythondata\\yuchuli\\event_bu.xlsx'#投融資事件補(bǔ)充數(shù)據(jù) event_bu = pd.read_excel(eventbufile) event_bu = DataFrame(event_bu)#合并文件 event_1 = pd.concat([event, event_bu], axis = 1, join='outer', sort=False) event_2 = pd.concat([event, event_bu], axis = 0, join='outer', sort=False) event_3 = pd.concat([event, event_bu], axis = 1, join='inner', sort=False) event_4 = pd.concat([event, event_bu], axis = 0, join='inner', sort=False) print("原文件,左文件的大小:", event.shape) print("原文件,右文件的大小:", event_bu.shape) print("axis = 1, join='outer'合并后的文件大小:", event_1.shape, "--行數(shù)取并集1000,右文件添加到左文件的后幾列") print("axis = 0, join='outer'合并后的文件大小:", event_2.shape, "--列數(shù)取并集13,右文件添加到左文件的下幾行") print("axis = 1, join='inner'合并后的文件大小:", event_3.shape, " --行數(shù)取交集100,右文件添加到左文件的后幾列") print("axis = 0, join='inner'合并后的文件大小:", event_4.shape, "--列數(shù)取交集11,右文件添加到左文件的下幾行")輸出結(jié)果:?
原文件,左文件的大小: (1000, 11) 原文件,右文件的大小: (100, 13) axis = 1, join='outer'合并后的文件大小: (1000, 24) --行數(shù)取并集1000,右文件添加到左文件的后幾列 axis = 0, join='outer'合并后的文件大小: (1100, 13) --列數(shù)取并集13, 右文件添加到左文件的下幾行 axis = 1, join='inner'合并后的文件大小: (100, 24) --行數(shù)取交集100, 右文件添加到左文件的后幾列 axis = 0, join='inner'合并后的文件大小: (1100, 11) --列數(shù)取交集11, 右文件添加到左文件的下幾行所以,橫向堆疊就是指 concat 函數(shù)的參數(shù) axis = 1 的情況(右文件添加到左文件的后幾列),至于是用 ‘inner’ 或 ‘outer’ ,就要視實際情況而定了,但是一般情況下是使用 outer ,通俗的講,一般合并數(shù)據(jù)的人都不希望越合并越小了。
縱向堆疊
與橫向堆疊相對的,縱向堆疊則是指將后一個表的數(shù)據(jù)堆疊到前一個表的下幾行,也就是上述Python代碼中 concat 函數(shù)的參數(shù) axis = 0 的情況。除了 concat 函數(shù),append 方法也可以實現(xiàn)縱向堆疊。
Python代碼
# -*- coding=utf-8 -*- import pandas as pd import numpy as np from pandas import DataFrame,Series#導(dǎo)入數(shù)據(jù) eventfile = u'D:\\pythondata\\yuchuli\\event.xlsx'#投融資事件 event = pd.read_excel(eventfile) event = DataFrame(event)eventbufile = u'D:\\pythondata\\yuchuli\\event_bu.xlsx'#投融資事件補(bǔ)充數(shù)據(jù) event_bu = pd.read_excel(eventbufile) event_bu = DataFrame(event_bu)#合并文件 event_1 = event.append(event_bu, sort=False) event_2 = pd.concat([event, event_bu], axis = 0, join='outer', sort=False) print("原文件,左文件的大小:", event.shape) print("原文件,右文件的大小:", event_bu.shape) print("append 方法合并后的文件大小:", event_1.shape) print("axis = 0, join='outer'合并后的文件大小:", event_2.shape)輸出結(jié)果:
原文件,左文件的大小: (1000, 11) 原文件,右文件的大小: (100, 13) append 方法合并后的文件大小: (1100, 13) axis = 0, join='outer'合并后的文件大小: (1100, 13)所以,append 方法對應(yīng)的是 concat 函數(shù)中 axis = 0, join='outer' 的情況。
主鍵合并
主鍵合并就是指前后兩個表按照一個或者多個鍵匹配的方式連接起來,一般是以某一或多列為鍵,匹配其他列,很類似 SQL 中的 join。pandas 庫中的 merge 函數(shù)和 join 函數(shù)都可以實現(xiàn)主鍵合并,和 SQL 中的 join 一樣, merge 函數(shù)和 join 函數(shù)也有左連接(left)、右連接(right)、內(nèi)連接(inner)、外鏈接(outer)。
merge 函數(shù)不僅可以實現(xiàn)?SQL 中的 join 函數(shù)的全部功能,還可以在匹配的過程中對數(shù)據(jù)進(jìn)行排序,通過其中的 sort 參數(shù)實現(xiàn)。
merge 函數(shù)基本語法
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,left_index=False, right_index=False,sort=False,suffixes=('_x', '_y'), copy=True,indicator=False,validate=None)left, right:分別表示需要匹配的左表和右表,可接收的數(shù)據(jù)類型為 DataFrame;
how:表示左右表的連接方式,默認(rèn)為 inner ,可接收的取值為 left、right、inner、outer;
on:表示左右表的連接主鍵,兩個表的主鍵名稱一致的時候才可以使用 on 參數(shù),不一致時需使用left_on,right_on參數(shù), on 參數(shù)默認(rèn)為None,可接收的數(shù)據(jù)類型為 str 或 sequence ;
left_on,right_on:分別表示左表和右表的連接主鍵,默認(rèn)為None,可接收的數(shù)據(jù)類型為 str 或 sequence ;
sort:表示是否對合并后的數(shù)據(jù)進(jìn)行排序,默認(rèn)為False,可接收的數(shù)據(jù)類型為boolean?;
其他參數(shù)相對不是那么常用,有興趣的可以參考:merge函數(shù)的常用參數(shù)及說明
join 函數(shù)基本語法
data1.join(data2, on=None,how='inner', lsuffix='', rsuffix='', sort=False)join 函數(shù)與?merge 函數(shù) 不同之處在于,join 函數(shù)要求兩個主鍵的名稱必須相同。
Python代碼
# -*- coding=utf-8 -*- import pandas as pd import numpy as np from pandas import DataFrame,Series import math#導(dǎo)入數(shù)據(jù) eventfile = u'D:\\pythondata\\yuchuli\\event.xlsx'#投融資事件 event = pd.read_excel(eventfile) event = DataFrame(event) event['事件id'] = event['事件id'].astype('str')#主鍵轉(zhuǎn)化成str格式institutionfile = u'D:\\pythondata\\yuchuli\\institution.xlsx'#事件id對應(yīng)投資機(jī)構(gòu) institution = pd.read_excel(institutionfile) institution = DataFrame(institution) institution = institution.dropna()#去空值 institution = institution.drop_duplicates()#去重復(fù)值 institution['事件id'] = institution['事件id'].astype('str')#主鍵轉(zhuǎn)化成str格式#合并文件 event_1 = pd.merge(event,institution, how='left', left_on='事件id', right_on='事件id') event_2 = event.join(institution, on='事件id', how = 'left', rsuffix='1')print("原文件,左文件的大小:", event.shape) print("原文件,右文件的大小:", institution.shape) print("append 方法合并后的文件大小:", event_1.shape) print("join 方法合并后的文件大小:", event_2.shape)輸出結(jié)果:
原文件,左文件的大小: (1000, 11) 原文件,右文件的大小: (48757, 2) append 方法合并后的文件大小: (1178, 12) join 方法合并后的文件大小: (1178, 12)重疊合并
數(shù)據(jù)處理的過程中偶爾會出現(xiàn)同樣一份數(shù)據(jù)存儲在兩張表中,單看兩張表的話,哪一張的數(shù)據(jù)都不算全,但是如果將其中一個表的數(shù)據(jù)補(bǔ)充進(jìn)另外一個表中,生成的這張新表則是相對完整的數(shù)據(jù)。這種方法就叫重疊合并,pandas 庫中提供了?combine_first 方法來實現(xiàn)這一功能。
combine_first 函數(shù)基本語法
data1.combine_first(data2)Python代碼
# -*- coding=utf-8 -*- import pandas as pd import numpy as np from pandas import DataFrame,Series import math#導(dǎo)入數(shù)據(jù) df1 = pd.DataFrame([[3, 1, 7], [3, 5, np.nan],[np.nan, np.nan, np.nan]]) df2 = pd.DataFrame([[9, np.nan, 4], [2, 1, 4]], index=[1, 2])#合并文件 df = df1.combine_first(df2) print("合并前的df1:\n", df1) print("合并前的df2:\n", df2) print("combine_first 方法合并后的文件:\n", df)輸出結(jié)果:
合并前的df1:0 1 2 0 3.0 1.0 7.0 1 3.0 5.0 NaN 2 NaN NaN NaN合并前的df2:0 1 2 1 9 NaN 4 2 2 1.0 4combine_first 方法合并后的文件:0 1 2 0 3.0 1.0 7.0 1 3.0 5.0 4.0 2 2.0 1.0 4.0over!
總結(jié)
以上是生活随笔為你收集整理的合并数据 - 方法总结(concat、append、merge、join、combine_first)- Python代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python xlrd使用_python
- 下一篇: websocket python爬虫_p