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