九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
python之Dataframe:多級(jí)表頭和索引靈活的處理(一)

DataFrame俗稱(chēng)數(shù)據(jù)框,和一般的Excel表格沒(méi)有多大區(qū)別,一般包含索引(行)和表頭(列),在python中,由pandas包提供。

這是一個(gè)最簡(jiǎn)單的數(shù)據(jù)框類(lèi)型,只包含一級(jí)索引和一級(jí)表頭

如果你的python還沒(méi)有這個(gè)包,請(qǐng)執(zhí)行以下命令安裝:

pip install pandas

這一節(jié),我們要處理的主題是:多級(jí)表頭和多級(jí)目錄
先看看他們長(zhǎng)什么樣子:

表格1:包含二級(jí)表頭和一級(jí)索引
表格二:包含二級(jí)索引和一級(jí)表頭

在Excel里面看這些表格,還沒(méi)什么特別的感覺(jué),但是,今天我們要在python中來(lái)處理這樣的表格,下面就開(kāi)始吧!先說(shuō)一下內(nèi)容大概:

1. 如何構(gòu)造出這樣的表格
2. 對(duì)于這樣的多級(jí)表格,如何修改,排序等常見(jiàn)操作

1. 如何構(gòu)造多級(jí)表格

多級(jí)表格,常來(lái)自于實(shí)際的需要,許多時(shí)候,我們的數(shù)據(jù)并不是單一的表現(xiàn)形式,會(huì)有對(duì)比、計(jì)算、時(shí)間序列等因素。我先給出兩個(gè)一級(jí)表格(也就是我們數(shù)據(jù)的原始形式)。

    日期  渠道  用戶(hù)數(shù) 會(huì)話數(shù) 唯一身份瀏覽量
0   20180607    (Other) 3839    7324    15223
1   20180607    Direct  30060   35364   72330
2   20180607    Display 2   2   2
3   20180607    Organic Search  50636   57410   144043
4   20180607    Referral    2845    3370    8380
5   20180607    Social  1310    1564    3480
6   20180607    shareasale.com  214 238 568
    日期  渠道  用戶(hù)數(shù) 會(huì)話數(shù) 唯一身份瀏覽量
0   20180531    (Other) 3756    6351    13825
1   20180531    Direct  33195   38812   78479
2   20180531    Display 2   2   2
3   20180531    Email   1   1   3
4   20180531    Organic Search  56003   64026   158187
5   20180531    Referral    3185    3769    9252
6   20180531    Social  3380    3690    7698
7   20180531    shareasale.com  241 268 658

Excel文件鏈接:https://pan.baidu.com/s/11xIBEm-jfj6o0Hz278Alvw 密碼:b515
你需要將這個(gè)表格文件下載下來(lái),使用pandas包的read_excel()函數(shù)讀入。

這2個(gè)數(shù)據(jù)表格分別是2018年6月7號(hào)各個(gè)渠道的流量數(shù)據(jù)以及上周同期的數(shù)據(jù),我們的目的是要做對(duì)比,把這2個(gè)表格的數(shù)據(jù)放到一起,方便對(duì)比查看。但我們用腦袋想一下,最方便對(duì)比的數(shù)據(jù)應(yīng)該是什么樣的呢?

前面我們已經(jīng)給出了2個(gè)示例,分別是2級(jí)表頭和2級(jí)索引,其實(shí)都起到了對(duì)比的作用。下面,我們就分別講一下這2個(gè)表格是怎么做出來(lái)的。

1.1 我們先來(lái)構(gòu)建多級(jí)表頭,如下這樣格式

表格1:包含二級(jí)表頭和一級(jí)索引
  • 導(dǎo)入包,讀入數(shù)據(jù)

import pandas as pd
from pandas import DataFrame

channel = pd.read_excel('處理多級(jí)表格-示例數(shù)據(jù).xlsx',sheetname=0)
channel_last_week = pd.read_excel('處理多級(jí)表格-示例數(shù)據(jù).xlsx', sheetname=1)

一般pandas包導(dǎo)入后會(huì)給個(gè)pd的別名。讀入xlsx格式的數(shù)據(jù)使用函數(shù)pd.read_excel(),第一個(gè)參數(shù)是文件所在路徑, 參數(shù)sheetname是指讀入這個(gè)工作簿當(dāng)中的哪個(gè)sheet,這里有2種寫(xiě)法:第一種是給出sheet的索引號(hào)(從左至右從0開(kāi)始計(jì)數(shù)),第二種是給出sheet的具體名稱(chēng),比如:

channel = pd.read_excel('處理多級(jí)表格-示例數(shù)據(jù).xlsx',sheetname='20180607')
  • 我們先講一種最常規(guī)的方法:拼接法
    顯然,我們有三個(gè)指標(biāo)是需要對(duì)比的:用戶(hù)數(shù)、會(huì)話數(shù)、唯一身份瀏覽量
    所以,我們先把渠道設(shè)置為索引,使用函數(shù)set_index()

channel.set_index('渠道', inplace=True)
channel_last_week.set_index('渠道', inplace=True)

注:在pandas中,一般set_xxx類(lèi)型的函數(shù)都會(huì)有一個(gè)參數(shù)inplace,代表是在原對(duì)象上修改,還是返回一個(gè)新的對(duì)象
這時(shí)候,我們的channel就變成了下面這樣

image.png

我們來(lái)看一下它的index和columns
channel.index
Out[74]: Index(['(Other)', 'Direct', 'Display', 'Organic Search', 'Referral', 'Social', 'shareasale.com'], dtype='object', name='渠道')
channel.columns
Out[75]: Index(['日期', '用戶(hù)數(shù)', '會(huì)話數(shù)', '唯一身份瀏覽量'], dtype='object')

如果細(xì)心的朋友一定會(huì)發(fā)現(xiàn),index和columns的值其實(shí)都是屬于同一個(gè)類(lèi): pandas.core.indexes.base.Index

type(channel.columns)
Out[76]: pandas.core.indexes.base.Index
type(channel.index)
Out[77]: pandas.core.indexes.base.Index
  • 現(xiàn)在來(lái)看這個(gè)日期,它里面的值應(yīng)該是作為表頭的,用來(lái)對(duì)比三個(gè)指標(biāo),所以,這里我們可以索性把它從columns中刪除掉,到時(shí)候直接把它的值拿出來(lái)備用

yd,yd_la = '20180607','20180531'
channel.drop('日期', axis=1, inplace=True)
channel_last_week.drop('日期', axis=1, inplace=True)

第一行中兩個(gè)變量間加逗號(hào)的寫(xiě)法,是一行同時(shí)實(shí)現(xiàn)2個(gè)及以上變量賦值的快捷寫(xiě)法,按順序一一對(duì)應(yīng)。
可能有人會(huì)說(shuō),我直接輸入日期字符串會(huì)顯得不夠自動(dòng)化和程序化,萬(wàn)一哪天傳入的數(shù)據(jù)里面日期不是這兩個(gè)呢?
其實(shí)你也可以使用如下的方法獲取

yd,yd_la = channel.iloc[0,0],channel_last_week.iloc[0,0]

iloc是根據(jù)位置進(jìn)行切片選擇的,你也可以使用鍵名稱(chēng)和索引名稱(chēng)選擇

yd,yd_la  = channel['日期']['Organic Search'],channel_last_week['日期']['Organic Search']

另外,刪除列,除了使用drop外,還可以直接這樣操作

del channel['日期']

這種寫(xiě)法我直接在原對(duì)象上刪除,不像drop還可以選擇返回刪除后的新對(duì)象(不影響原對(duì)象)
drop除了可以刪除列,還可以刪除行,只需要設(shè)置axis=0(默認(rèn)),輸入索引值即可,比如

channel.drop('Direct')

刪除了索引值為Direct的行。
現(xiàn)在我們的channal對(duì)象是這樣的了


image.png
  • 開(kāi)始構(gòu)造,最直觀的做法就是把兩個(gè)表中同一個(gè)指標(biāo)的數(shù)據(jù)合并在一起,并且將日期作為底層表頭,指標(biāo)作為第二層表頭
    DataFrame的合并函數(shù)有好幾個(gè):merge(基于column名稱(chēng))、append、concat(基于index的值)...這里我們選擇concat.

df_user = pd.concat([channel_last_week['用戶(hù)數(shù)'], channel['用戶(hù)數(shù)']],
                        keys=[yd_la, yd], axis=1).fillna(0)

先看一下結(jié)果:


image.png

請(qǐng)忽略小數(shù)(顯示問(wèn)題)。可以看到,左邊是上周同期的,右邊是6月7號(hào)的。
concat的參數(shù):

  • 第一個(gè)list類(lèi)型,元素是要合并的DataFrame;

  • keys起到的作用是,其值作為合并后新DataFrame的列名,axis=1的作用是橫著合并(等于0的時(shí)候代表* 豎這合并,相當(dāng)于拼接在下方);

  • 最后有個(gè)fillna函數(shù),是因?yàn)槿绻谐霈F(xiàn)索引對(duì)不齊的情況,則會(huì)匹配出NA值(比如Email這個(gè)索引值就不是都有,匹配后20180607這列的值就為0)


  • 最后成型
    有了上面的合并經(jīng)驗(yàn),我們可以把上面的那個(gè)合并結(jié)果作為一個(gè)整體,然后對(duì)每一個(gè)columns指標(biāo)都做同樣的事情,最后合并起來(lái),其keys的值就是原columns的值,如下所示:

df_session = pd.concat([channel_last_week['會(huì)話數(shù)'], channel['會(huì)話數(shù)']],
                        keys=[yd_la, yd], axis=1).fillna(0)
df_uv = pd.concat([channel_last_week['唯一身份瀏覽量'], channel['唯一身份瀏覽量']],
                           keys=[yd_la, yd], axis=1).fillna(0)
channel_together = pd.concat([df_user,df_session,df_uv],keys=['用戶(hù)數(shù)', '會(huì)話數(shù)', '唯一身份瀏覽量'],axis=1).fillna(0)

最后來(lái)看我們的channel_together 長(zhǎng)什么樣

Out[119]: 
                    用戶(hù)數(shù)               會(huì)話數(shù)           唯一身份瀏覽量          
               20180531 20180607 20180531 20180607 20180531  20180607
(Other)         3756     3839  6351     7324   13825    15223 
Direct          33195    30060  38812    35364  78479    72330 
Display         2        2.0      2        2      2        2     
Email           1        0.0      1        0      3        0     
Organic Search  56003    50636.0  64026    57410  158187   144043
Referral        3185     2845   3769     3370   9252     8380  
Social          3380     1310   3690     1564   7698     3480  
shareasale.com  241      214    268      238    658      568

將其輸出到Excel中就是目標(biāo)中的那種格式啦!但是,你這個(gè)代碼未免有點(diǎn)過(guò)長(zhǎng)了,而且類(lèi)似的代碼比較多,現(xiàn)在,我們使用列表推導(dǎo)式,重新得到channel_together
發(fā)大招啦~~~

 channel_together = pd.concat([
        pd.concat([channel_last_week[column], channel[column]], keys=[yd_la, yd], axis=1)
        for column in ['用戶(hù)數(shù)', '會(huì)話數(shù)', '唯一身份瀏覽量']], axis=1, keys=['用戶(hù)數(shù)', '會(huì)話數(shù)', '唯一身份瀏覽量']).fillna(0)
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
大數(shù)據(jù)理論課(-----pandas對(duì)DataFrame表格的切割、合并、去重)
建議收藏:12個(gè)Pandas數(shù)據(jù)處理高頻操作
數(shù)據(jù)科學(xué) | Pandas數(shù)據(jù)分析入門(mén)
python大規(guī)模數(shù)據(jù)處理技巧之一:數(shù)據(jù)常用操作
Pandas DataFrame連接表,幾種連接方法的對(duì)比
pandas的菜鳥(niǎo)級(jí)應(yīng)用(誰(shuí)都能學(xué)會(huì))
更多類(lèi)似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服