零基礎學習Python數據分析:數據處理模塊Pandas使用(4)
實際情況中,我們不可能只有一張表,而是多個DataFrame提供了不同多樣的信息,由此組成了一個完整的資料庫。當然,也可以把所有信息歸到一個表中,但是這樣的話,就可能有好多信息重複。如果同一客戶進行多次購買,就會重複記錄客戶地址、聯繫方式等。如果同一產品由多個客戶訂購,則產品價格和描述將重複。 這將使我們的訂單表冗餘而難以管理。
這節我們學習如何用Pandas管理多個表。
假設現在有多個表:
訂單表orders(product_id/customer_id/quantity/timestamp)
產品表products(product_id/product_description/product_price)
客戶表customers(customer_id/customer_name/customer_address/customer_phone_number)
學過資料庫的同學都發現,雖然都是不同表,但表間是有聯繫的。
一、查詢DataFrame
假設我想查詢訂單表orders中訂單號order_id=2的訂單中物品描述description
這個可以使用兩次索引達到查詢的目的:
首先你應該使用
df=orders[orders.order_id==2]
來選出所有符合條件的行,然後再次使用切片df[description],當然也可以直接寫出
orders[orders.order_id==2][description]
也可以直接使用DataFrame的loc的函數方法
df=orders.loc[orders.order_id==2,description]
兩個方法是一樣的~
二、合併DataFrame
如果我們只查看訂單表,我們無法確切了解每個訂單中發生了什麼。 但是,如果我們參考其他表格,我們可以得到更完整的信息。
我們來看一下order_id為1的訂單。它是由customer_id為2購買的。要找出客戶的名稱,我們查看客戶表並查找customer_id值為2的項目。我們可以看到客戶2的名稱是 Jane Doe,並且她住在456 Park Ave。
這種匹配就稱為合併兩個DataFrames。
pandas.Dataframe 的合併.merge
命令可以實現合併。然後它將匹配合併到一個新表中的一行中。類似於SQL中的theta連接語句。
new_df = pd.merge(orders, customers)
也可以
new_df = orders.merge(customers)
以上情況常用於合併多個DataFrame.
big_df = orders.merge(customers).merge(products)
多表合併後的查詢
import pandas as pdsales = pd.read_csv(sales.csv)print salestargets = pd.read_csv(targets.csv)print targetsmen_women=pd.read_csv(men_women_sales.csv)all_data=men_women.merge(sales).merge(targets)print(all_data)results=all_data[(all_data.revenue>all_data.target)&(all_data.women>all_data.men)]
三、特殊合併
在前面的例子中,merge函數「知道」如何基於兩個表之間相同的列去合併成新表。
例如,客戶表和產品表都有一欄id分別用於表示客戶編號和產品編號。因為id列在每一個表中意味著不同的東西,我們默認的合併將是錯誤的。我們可以解決這個問題的一種方法是使用重命名來重命名合併的列。在下面的例子中,我們將重新命名列ID customer_id,使訂單和客戶有一個共同的列合併。
import pandas as pdorders = pd.read_csv(orders.csv)print ordersproducts = pd.read_csv(products.csv)print productsorders_product=orders.merge(products.rename(columns={id:product_id}))print orders_product
還有一種方法可以解決此問題。我們可以使用關鍵詞left_on和right_on指定我們要執行合併的列。left DataFrame 是先儲入Pandas的,right DataFrame是後儲入Pandas的。
import pandas as pdorders = pd.read_csv(orders.csv)print ordersproducts = pd.read_csv(products.csv)print productspd.merge(orders,products,left_on=product_id,right_on=id)
細心的朋友們可能發現了product_id還在,id卻不見了,出現了idx,idy。通常情況下他們是冗餘的,我們可以用suffixes關鍵詞改寫_x和_y.
pd.merge(orders,products,left_on=product_id,
ight_on=id,suffixes=[_orders,_products])
四、外合併Outer Merge左合併Left Merge
如果合併表時缺少對應的匹配編號,會出現怎麼樣的結果呢。假設我們倉庫里沒有5號零部件了,但是客戶仍在訂購。那把訂單表和產品表合併會出現怎樣的結果
import pandas as pdorders = pd.read_csv(orders.csv)products = pd.read_csv(products.csv)print(orders.head())print(products.head())merged_df=pd.merge(orders,products)print(merged_df)
也就是說,合併表時缺少對應的匹配編號會抹去對應行。上述這種類型的合併(只包含匹配的行)稱為內部合併Inner Merge。當我們希望從不匹配的行中保存信息時,還可以使用其他類型的合併。
假設A公司和B公司剛剛合併。每家都有一個客戶列表,但他們的數據略有不同。A公司有每個客戶的名字和電子郵件。B公司有每個客戶的名字和電話號碼。他們有一些共同的客戶,但有些是不同的。
將兩個公司的數據合併而不丟失任何客戶,我們可以使用外部連接Outer Merge。外部聯接將包括來自兩個表的所有行,即使包含一些因不匹配而造成的缺失值。任何缺失值都用「None」或「nan」填充。
pd.merge(company_a, company_b, how=outer)
(默認為inner)
仍然以上列說明Left Merge的使用
假設我們想確定哪些客戶缺少電話信息。我們想要一個有Email但沒有Phone顧客名單。
我們可以通過執行左合併來得到這個結果。左合併包含第一個(左)表中的所有行,但只有與第一個表匹配的第二個(右)表中的行。
Ps.A公司聯繫方式為Email,B公司聯繫方式為Phone。
pd.merge(company_a, company_b, how=left)
五、DataFrame的連接
數據常常被分割成多個CSV文件,因此每個下載文件都較小。當我們想要把多個csv文件組合成單個csv文件時,可以使用pd.concat([df1, df2, df2, ...])
這種方法只針對所有列都是相同的DataFrame集合。
pd.concat([df1, df2])
推薦閱讀:
※R語言實戰第八章:回歸
※Kaggle機器學習之泰坦尼克號生還預測
※敲黑板!從零開始,小白如何通過Kaggle競賽提高數據分析能力!
※基於新浪微博的男女性擇偶觀數據分析
※Python LEVEL4:數據分析標準步驟