1. 程式人生 > >【Python實戰】Pandas:讓你像寫SQL一樣做資料分析(二)

【Python實戰】Pandas:讓你像寫SQL一樣做資料分析(二)

1. 引言

前一篇介紹了Pandas實現簡單的SQL操作,本篇中將主要介紹一些相對複雜一點的操作。為了方便後面實操,先給出一份簡化版的裝置統計資料:

0   android NLL 387546520   2099457911
0   ios NLL 52877990    916421755
1   android 魅族  8995958 120369597
1   android 酷派  9915906 200818172
1   android 三星  16500493    718969514
1   android 小米  23933856    290787590
1   android 華為  26706736    641907761
1   ios 蘋果  52877990    916421755
2   android 小米-小米4  2786675 55376581
2   android 魅族-m2-note  4642112 130984205
2   android OPPO-A31    4893428 62976997
2   ios 蘋果-iPhone-6s    5728609 99948716

其中,第一列表示維度組合編號,第二列表示作業系統型別,第三列為維度值(NLL表示缺失,即第一行、第二行表示作業系統的統計,其餘表示廠商或機型),第三列、第四列分別表示UV、PV;且欄位之間為\t分隔。讀取該檔案為DataFrame:

import pandas as pd


df = pd.read_csv(path, names=['id', 'os', 'dim', 'uv', 'pv'], sep='\t')

2. 實戰

Add

在原dataframe上,增加一行資料;可通過dataframe的append函式來追加:

import numpy as np
row_df = pd.DataFrame(np.array([['2', 'ios', '蘋果-iPad 4', 3287509, 32891811]]), columns=['id', 'os', 'dim', 'uv', 'pv'])
df = df.append(row_df, ignore_index=True)

增加一列資料,則比較簡單:

df['time'] = '2016-07-19'

To Dict

關於android、ios的PV、UV的dict:

def where(df, column_name, id_value):
    df = df[df[column_name] == id_value]
    return df


def to_dict(df):
    """
    {"pv" or "uv" -> {"os": os_value}}
    :return: dict
    """
    df = where(df, 'id', 0)
    df_dict = df.set_index('os')[['uv', 'pv']].to_dict()
    return df_dict

Top

group某列後的top值,比如,android、ios的UV top 2的廠商:

def group_top(df, group_col, sort_col, top_n):
    """
    get top(`sort_col`) after group by `group_col`
    :param df: dataframe
    :param group_col: string, column name
    :param sort_col: string, column name
    :param top_n: int
    :return: dataframe
    """
    return df.assign(rn=df.sort_values([sort_col], ascending=False)
                     .groupby(group_col)
                     .cumcount() + 1) \
        .query('rn < ' + str(top_n + 1)) \
        .sort_values([group_col, 'rn'])

全域性top值加上group某列後的top值,並有去重:

def top(df, group_col, sort_col, top_n):
    """overall top and group top"""
    all_top_df = df.nlargest(top_n, columns=sort_col)
    grouped_top_df = group_top(df, group_col, sort_col, top_n)
    grouped_top_df = grouped_top_df.ix[:, 0:-1]
    result_df = pd.concat([all_top_df, grouped_top_df]).drop_duplicates()
    return result_df

排序編號

對某列排序後並編號,相當於給出排序名次。比如,對UV的排序編號:

df['rank'] = df['uv'].rank(method='first', ascending=False).apply(lambda x: int(x))

Left Join

Pandas的left join對NULL的列沒有指定預設值,下面給出簡單的實現:

def left_join(left, right, on, right_col, default_value):
    df = pd.merge(left, right, how='left', on=on)
    df[right_col] = df[right_col].map(lambda x: default_value if pd.isnull(x) else x)
    return df

自定義

對某一列做較為複雜的自定義操作,比如,廠商的UV佔比:

def percentage(part, whole):
    return round(100*float(part)/float(whole), 2)


os_dict = to_dict(df)
all_uv = sum(os_dict['uv'].values())
df = where(df, 'id', 1)
df['per'] = df.apply(lambda r: percentage(r['uv'], all_uv), axis=1)

重複值

某列的重複值的行:

duplicate = df.duplicated(subset=columns, keep=False)

寫MySQL

Pandas的to_sql函式支援Dataframe直接寫MySQL資料庫。在公司開發時,常常會有辦公網與研發網是不通的,Python的sshtunnel模組提供ssh通道,便於入庫debug。

import MySQLdb
from sshtunnel import SSHTunnelForwarder


with SSHTunnelForwarder(('porxy host', port),
                        ssh_password='os passwd',
                        ssh_username='os user name',
                        remote_bind_address=('mysql host', 3306)) as server:
    conn = MySQLdb.connect(host="127.0.0.1", user="mysql user name", passwd="mysql passwd",
                           db="db name", port=server.local_bind_port, charset='utf8')
    df.to_sql(name='tb name', con=conn, flavor='mysql', if_exists='append', index=False)

相關推薦

Python實戰PandasSQL一樣資料分析

1. 引言 前一篇介紹了Pandas實現簡單的SQL操作,本篇中將主要介紹一些相對複雜一點的操作。為了方便後面實操,先給出一份簡化版的裝置統計資料: 0 android NLL 387546520 2099457911 0 ios NLL 52877990 916421755 1 and

Python實戰PandasSQL一樣資料分析

1. 引言 Pandas是一個開源的Python資料分析庫。Pandas把結構化資料分為了三類: Series,1維序列,可視作為沒有column名的、只有一個column的DataFrame; DataFrame,同Spark SQL中的DataFrame一樣,其概念來自於R語言,為多column並sch

Markdown費事?Typoraword一樣行雲流水,所見即所得。

Typora 簡介 Typora刪除了預覽視窗,以及所有其他不必要的干擾。取而代之的是實時預覽。 Markdown的語法因不同的解析器或編輯器而異,Typora使用的是GitHub Flavored Markdown。 下載 Typora下載。 常用快捷鍵 加粗: 

利用python/pandas/numpy資料分析-透視表pivot_table

透視表,根據一個或多個鍵進行聚合,並根據行列上的分組鍵將資料分配到各個矩形區域中. import numpy as np data=pd.DataFrame(np.arange(6).reshape((2,3)), index

Python 金融資料分析

1.樣本資料位置 series = Series() series.mean() # 均數 series.median() # 中位數 series.mode() # 眾數 series.quantil

利用python資料分析-reindex

DataFrame.reindex(index=None, columns=None, **kwargs) reindex 函式的引數 引數 說明 method 插值填充方法 fill_value 引入的缺失資料值

MongoDb入門15分鐘敢說自己會用MongoDB了

一.MongDB是什麼呢,我該如何下手呢? MongoDB是一個基於分散式檔案儲存的資料庫。由C++語言編寫。旨在為WEB應用提供可擴充套件的高效能資料儲存解決方案。 如果小夥伴你的機器上還沒有安裝MongoDb的話請快快去安裝吧,下載地址:https://www.mongodb.com/download

Python實戰用Scrapyd把Scrapy爬蟲一步一步部署到騰訊雲

將我們的爬蟲部署到騰訊雲伺服器上面。廢話不多說,我們就來實戰操作吧。 這裡選擇什麼雲服務都是可以的,阿里雲,AWS,騰訊雲,其他雲都是沒有問題的。部署方法基本一樣,這裡為了方便,所以筆者選擇了騰訊雲來做講解。 既然我們選擇了騰訊雲,首先去騰訊雲的官網,註冊登入一下。 點選複製https:

7個Python實戰專案程式碼,分分鐘晉級大神!

關於Python有一句名言:不要重複造輪子。 但是問題有三個: 1、你不知道已經有哪些輪子已經造好了,哪個適合你用。有名有姓的的著名輪子就400多個,更別說沒名沒姓自己在製造中的輪子。 2、確實沒重複造輪子,但是在重複製造汽車。包括好多大神寫的好幾百行程式碼,為的是

保險專題一則故事輕鬆瞭解保險的實質

正文:        100個學徒工來到一家五星級大酒店學習廚藝,他們要勤勤懇懇學習十年才能出師。學徒們的薪水不高,一年只有幾百塊,但是五星級酒店的餐具都非常名貴,一個盤子要1000塊錢。如果哪個學徒不小心打壞了一個盤子,那麼他不僅要傾家蕩產來賠償這1000元錢,還可

Python實戰機型自動化標註搜狗爬蟲實現

1. 引言 從安卓手機收集上來的機型大都為這樣: mi|5 mi|4c mi 4c 2014022 kiw-al10 nem-tl00h 收集的機型大都雜亂無章,不便於做統計分析。因此,標註顯得尤為重要。 中關村線上有對國內大部分手機的介紹情況,包括手機機型nem-tl00h及其對應的常見名稱榮耀暢玩5C

Python實戰Scrapy豌豆莢應用市場爬蟲

對於給定的大量APP,如何爬取與之對應的(應用市場)分類、描述的資訊?且看下面分解。 1. 頁面分析 當我們在豌豆莢首頁搜尋框輸入微信後,會跳轉到搜尋結果的頁面,其url為http://www.wandoujia.com/search?key=%微信。搜尋結果一般是按相關性排序的;所以,我們認為第一條搜尋結果

Python實戰Django建站筆記

前一段時間,用Django搭建一個報表分析的網站;藉此正好整理一下筆記。 1. 安裝 python有包管理工具pip,直接cd Python27/Scripts,輸入 pip install django # install by version pip install --upgrade Django==

7個Python實戰專案程式碼,感受下大神是如何起飛的!

關於Python有一句名言:不要重複造輪子。 但是問題有三個: 1、你不知道已經有哪些輪子已經造好了,哪個適合你用。有名有姓的的著名輪子就400多個,更別說沒名沒姓自己在製造中的輪子。 2、確實沒重複造輪子,但是在重複製造汽車。包括好多大神寫的好幾百行程式碼,為的是解決

Unity Shaders使用CgInclude的Shader模組化——建立CgInclude檔案儲存光照模型

這裡是本書所有的插圖。這裡是本書所需的程式碼和資源(當然你也可以從官網下載)。========================================== 分割線 ==========================================寫在前面瞭解內建的C

Tensorflow怎樣為的網路預加工和打包訓練資料資料集的處理方案

實驗環境:python2.7 第二篇我們來講一講小資料集的處理方法,小資料集一般多以文字儲存為主,csv是一種流行的資料格式,另外也有txt等。當然也會有.mat或者.npy這種經過處理的格式。 一.處理csv格式資料集 實驗資料集是鳶尾花卉資料集iris,格式是.csv

Unity Shaders使用CgInclude的Shader模組化——Unity內建的CgInclude檔案

這裡是本書所有的插圖。這裡是本書所需的程式碼和資源(當然你也可以從官網下載)。========================================== 分割線 ==========================================寫在前面啦啦啦,又開

Python-OpenCvmodule 'cv2.cv2' has no attribute 'xfeatures2d'問題已解決,親測有效!

一、問題 module 'cv2.cv2' has no attribute 'xfeatures2d' 二、原因 該演算法已經申請專利,開源OpenCV沒有版權,新的OpenCV去掉了這個演算法。   三、解決方案 1、推薦解決辦法 pip uninsta

Python爬蟲微信公眾號歷史文章和文章評論API分析

上一篇文章爬取微信公眾號文章資訊準備工作介紹了微信公眾號歷史文章和文章評論API的組成情況,歷史文章API格式:https://mp.weixin.qq.com/mp/profile_ext?action=getmsg&__biz=MjM5NjAxOTU4MA==&f=json&

深度學習8CNN卷積神經網路與sklearn資料集實現數字識別

前言:這個程式碼是自己閒暇無事時候寫的。 因為CNN卷積神經網路用MNIST資料集、sklearn資料集程式碼很多部分都很相似,這一篇就不附詳細說明,原始碼最下。CNN卷積神經網路的工作原理,請詳情參考——【深度學習】5:CNN卷積神經網路原理、MNIST資料