零基礎學習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 的合併blog.csdn.net

.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

orders

products

orders_product

還有一種方法可以解決此問題。我們可以使用關鍵詞left_on和right_on指定我們要執行合併的列。left DataFrame 是先儲入Pandas的,right DataFrame是後儲入Pandas的。

orders

products

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號零部件了,但是客戶仍在訂購。那把訂單表和產品表合併會出現怎樣的結果

orders 注意3號訂單定了5號零部件

products

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)

order id 3消失了

也就是說,合併表時缺少對應的匹配編號會抹去對應行。上述這種類型的合併(只包含匹配的行)稱為內部合併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:數據分析標準步驟

TAG:商業分析 | 數據分析 | 大數據 |