合併 多個dataframe 第五章 合併

2021-10-16 11:22:43 字數 4027 閱讀 3145

(a)利用series新增行(必須指定name)

s = pd.series(,name='new_row')

(b)用dataframe新增表

df_temp = pd.dataframe(,index=['new_1','new_2'])
此方法主要用於新增列,列名直接由引數指定:

s = pd.series(list('abcd'),index=range(4))
可以一次新增多個列:

col2=s)

comine和update都是用於表的填充函式,可以根據某種規則填充

1)填充物件

關於combine很重要的一點是需要理解它是按照表的順序輪流進行逐列迴圈的,而且自動索引對齊,缺失值為nan:

df_combine_1 = df.loc[:1,['gender','height']].copy()

df_combine_2 = df.loc[10:11,['gender','height']].copy()

df_combine_1.combine(df_combine_2,lambda x,y:print(x,y))

2)一些例子例①:根據列均值的大小填充

# example_1:看兩個df中誰的均值大就用誰的來填充相應位置

df1 = pd.dataframe()

df2 = pd.dataframe()

df1.combine(df2,lambda x,y:x if x.mean()>y.mean() else y)

例②:索引對齊特性(預設狀態下,後面的表沒有的行列都會設定為nan)

df2 = pd.dataframe(,index=[1,2])

df1.combine(df2,lambda x,y:x if x.mean()>y.mean() else y)

例③:使得df1原來符合條件的值不會被覆蓋

df1.combine(df2,lambda x,y:x if x.mean()>y.mean() else y,overwrite=false)
例④:在新增匹配df2的元素位置填充-1

df1.combine(df2,lambda x,y:x if x.mean()>y.mean() else y,fill_value=-1)
3)combine_first方法這個方法作用是用df2填補df1的缺失值,功能比較簡單,但很多時候會比combine更常用,下面舉兩個例子:

df1 = pd.dataframe()

df2 = pd.dataframe()

df1.combine_first(df2)

df1 = pd.dataframe()

df2 = pd.dataframe(, index=[1, 2])

df1.combine_first(df2)

這兩個例子不太一樣的地方在於,第二個例子中df2的索引及列名與df1是不一樣的,因此只能用相應位置的元素進行填充,其他的地方還是nan

1)三個特點

①返回的框索引只會與被呼叫框的一致(預設使用左連線,下一節會介紹)

②第二個框中的nan元素不會起作用

③沒有返回值,直接在df上操作

2)例子

例①:索引完全對齊情況下的操作,會把對應的列和索引中的元素填充,其餘不變

df1 = pd.dataframe()

df2 = pd.dataframe()

df1.update(df2)

例②:部分填充:

df1 = pd.dataframe()

df2 = pd.dataframe(, index=[1,2])

df1.update(df2)

這種情況下,會用df2中和df1中一樣列名和索引的位置上的元素去替換df1

例③:缺失值不會填充

df1 = pd.dataframe()

df2 = pd.dataframe()

df1.update(df2)

concat方法可以在兩個維度上拼接,預設為縱向拼接(axis=0),拼接方式缺省外連線,也就是取拼接方向的並集,而'inner'時取拼接方向(若使用預設的縱向拼接,則為列的交集)的交集。

典型用法如下:

pd.concat([df3,df1],join='outer',sort=true)
merge函式的作用是將兩個pandas物件橫向合併,遇到重複的索引項時會使用笛卡爾積,預設inner連線,可選left、outer、right連線。

所謂左連線,就是指以第乙個表索引為基準,右邊的表中如果不在左邊的則不加入,如果在左邊的就以笛卡爾積的方式加入。

merge/join與concat的不同之處在於on引數,可以指定某乙個物件為key來進行連線,也可以用多組鍵進行連線。

關於笛卡爾積,簡單點理解就是對映要全的意思,例子如下:

上述例子的最終結果

由於right中b這一列有3行,因此,left裡邊每一行中b列的2,都要與right中這3行分別做一遍對映,因此最終有6列。

join函式作用是將多個pandas物件橫向拼接,遇到重複的索引項時會使用笛卡爾積,預設左連線,可選inner、outer、right連線,示例如下:

left = pd.dataframe()

index = pd.multiindex.from_tuples([('k0', 'k0'), ('k1', 'k0'),

('k2', 'k0'), ('k2', 'k1')],names=['key1','key2'])

right = pd.dataframe(,

index=index)

left.join(right, on=['key1','key2'])

combine和update主要是用第二個df來填充第乙個,主要區別在於combine是兩個df按照規則進行逐列組合,自動索引對齊,缺失值補充為nan,update則是使用來自另乙個dataframe的非nan值就地進行修改,在索引上對齊,沒有返回值;

concat可以在兩個維度上對兩個df進行拼接,預設為縱向拼接(axis=0),拼接方式缺省外連線,也就是取拼接方向的並集,而'inner'時取拼接方向(若使用預設的縱向拼接,則為列的交集)的交集。

merge可以將兩個pandas物件橫向合併,遇到重複的索引項時會使用笛卡爾積。與concat在axis=1的差別在於on引數可以指定在key值下連線。

join函式作用是將多個pandas物件橫向拼接,遇到重複的索引項時會使用笛卡爾積,預設左連線,可選inner、outer、right連線。

merge_ordered:函式允許組合時間序列和其他有序資料。 特別是它有乙個可選的fill_method關鍵字來填充/插入缺失的資料。

merge_asof:除了我們匹配最近的鍵而不是相等的鍵之外,其他的都類似於有序的left-join 。 對於左側dataframe中的每一行,我們選擇右側dataframe中on鍵對應的值小於left的鍵對應的值的最後一行。 兩個dataframe必須按鍵排序。

多個dataframe的列合併與行合併

將多個資料表,以時間為索引,並選取需要分析的列進行合併。在本文中,拿到的資料是同一時期的不同裝置的特徵資料,需要提取對應的列進行時間合併,在合併過程中存在以下問題 1 時間索引存在重複,需要刪除重複項,否則合併時會報錯 2 每個表中需要提取的列名稱一樣,需要在合併前進行重新命名,否則合併後就無法區分...

DataFrame資料合併

一 join 作用 預設情況下,他是把行索引相同的資料合併到一起 注意 以左為準,沒有的部分用nan補全 例子import pandas as pd import numpy as np df1 pd.dataframe data np.zeros 2,5 index list ab columns...

多個DataFrame的儲存

datadf型別 list中包含若干個dataframe,由於每個dataframe都很大,現在需要把每個dataframe分別儲存成乙個csv方便讀取 嘗試1 為了省記憶體,把每個dataframe轉換成str格式進行儲存 file open temp diff strline.csv w for...