聚沙成塔--數(shù)據(jù)分析(二)(pandas的DataFrame結(jié)構(gòu))

版權(quán)聲明:本文為作者原創(chuàng)文章丹鸿,可以隨意轉(zhuǎn)載越走,但必須在明確位置標明出處!?炕丁廊敌!

DataFrame是一個表格類型的數(shù)據(jù)結(jié)構(gòu),想當于一個二維的數(shù)組门怪,只不過DataFrame是按列來存儲的庭敦,每一列可以有不同的數(shù)據(jù)類型,但每一列智能有一種數(shù)據(jù)類型薪缆,你可以把它想象成一個關(guān)系型數(shù)據(jù)庫表秧廉,DataFrame也可是認為是由多個Series組成的,所有DataFrame取出的每一列都是一個Series數(shù)據(jù)結(jié)構(gòu)拣帽。

構(gòu)建一個DataFrame數(shù)據(jù)結(jié)構(gòu)可以有幾種方法疼电,可以是一位的字典類型的ndarrays、list减拭、dicts蔽豺、或Series等等。

Series字典結(jié)構(gòu)構(gòu)建一個DataFrame結(jié)構(gòu)

import pandas as pd
import numpy as np

data = {'A': pd.Series(np.random.randn(3), index=['a','b','c']),
        'B': pd.Series(np.random.randn(4), index=['a','b','c', 'd'])}

df = pd.DataFrame(data)

print(df)

OUT:
          A         B
a  0.965723  0.072575
b -1.847803 -0.142484
c -1.104322  1.540840
d       NaN -0.843574

從結(jié)果中可以看出key作為了列索引了拧粪,index作為行標簽索引修陡,沒一列都是一個Series結(jié)構(gòu),NaN作為缺省值被填充在A列最后一個值已達到數(shù)據(jù)對齊的目的可霎。如果我們?yōu)镈ataFrame指定了索引值魄鸦,那么將安裝索引值進行排序

import pandas as pd
import numpy as np

data = {'A': pd.Series(np.random.randn(3), index=['a','b','c']),
        'B': pd.Series(np.random.randn(4), index=['a','b','c', 'd'])}

df = pd.DataFrame(data, index=['b', 'c', 'a'])

print(df)

OUT:
          A         B
b  0.403256  2.753227
c -0.220886  1.728152
a  0.909863  0.240732

如果給出的索引在data數(shù)據(jù)列索引中沒有將會以缺省值填充。DataFrame既然是二維的數(shù)據(jù)結(jié)構(gòu)那么它也能指定列索引癣朗。

import pandas as pd
import numpy as np

data = {'A': pd.Series(np.random.randn(3), index=['a','b','c']),
        'B': pd.Series(np.random.randn(4), index=['a','b','c', 'd'])}

df = pd.DataFrame(data, index=['b', 'c', 'a'], columns=['A', 'C'])

print(df)
OUT:
          A    C
b -0.914111  NaN
c -0.086271  NaN
a  0.256684  NaN

當然行列都被以索引的屬性提供給了DataFrame數(shù)據(jù)類型拾因,你可以通過df.index取到行標簽索引,通過df.columns取到列標簽索引。

ndarrays&lists構(gòu)建DataFrame

import pandas as pd
import numpy as np

data = {'A': [1,2,3,4],
        'B': [5,6,7,8]}

df = pd.DataFrame(data)

print(df)

OUT:
   A  B
0  1  5
1  2  6
2  3  7
3  4  8

從列表字典類型構(gòu)建DataFrame

import pandas as pd
import numpy as np

data = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]

df = pd.DataFrame(data)

print(df)

OUT:
   a   b     c
0  1   2   NaN
1  5  10  20.0

當然你可以像上面那樣去指定它的index绢记、columns扁达。

從元組字典類型構(gòu)建DataFrame

import pandas as pd
import numpy as np

data = {('a', 'b'):{('A', 'B'):1, ('A', 'C'): 2},
        ('a', 'a'): {('A', 'C'): 3, ('A', 'B'): 4}}

df = pd.DataFrame(data)

print(df)

OUT:
     a   
     a  b
A B  4  1
  C  3  2

從元組字典類型構(gòu)建的DataFrame數(shù)據(jù)類型是一個多索引的數(shù)據(jù)結(jié)構(gòu)類型,不過思想都是一樣的key作為列索引蠢熄,值里面的key作為行索引跪解。關(guān)于多個索引將會在后面介紹。

列的選取签孔、增加惠遏、刪除、篩選

  • 選取一列
import pandas as pd
import numpy as np

data = {'A': pd.Series(np.random.randn(3), index=['a','b','c']),
        'B': pd.Series(np.random.randn(3), index=['a','b','c'])}

df = pd.DataFrame(data)

print(df['A'])

OUT:
a    0.518881
b    0.928695
c   -0.843319
Name: A, dtype: float64

當然你也可以選取多列骏啰,多列的選取可以像下面這么做

import pandas as pd
import numpy as np

data = {'A': pd.Series(np.random.randn(3), index=['a','b','c']),
        'B': pd.Series(np.random.randn(3), index=['a','b','c']),
        'C': pd.Series(np.random.randn(3), index=['a','b','c'])}


df = pd.DataFrame(data)

print(df[['A', 'C']])
OUT:
          A         C
a  0.940624  0.035024
b  0.318521  0.222687
c  0.180449  0.433753

你還可以使用iloc按行位置選取节吮、loc按行標簽索引選取

import pandas as pd
import numpy as np

data = {'A': pd.Series(np.random.randn(3), index=['a','b','c']),
        'B': pd.Series(np.random.randn(3), index=['a','b','c']),
        'C': pd.Series(np.random.randn(3), index=['a','b','c'])}


df = pd.DataFrame(data)

print(df)

# 按行位置索引
print('取行索引為1的一行數(shù)據(jù):\n%s' % df.iloc[1])
print('取行索引為1,2的兩行數(shù)據(jù):\n%s' % df.iloc[1:])

# 按行標簽索引
print('取行標簽索引為b的一行數(shù)據(jù):\n%s' % df.loc['b'])
print('取行標簽索引為a到c的三行數(shù)據(jù):\n%s' % df.loc['a': 'c'])
OUT:
          A         B         C
a  0.284014  1.053296  0.529340
b -1.443032  1.114718  0.449405
c -0.087776  1.718656 -0.490695
取行索引為1的一行數(shù)據(jù):
A   -1.443032
B    1.114718
C    0.449405
Name: b, dtype: float64
取行索引為1,2的兩行數(shù)據(jù):
          A         B         C
b -1.443032  1.114718  0.449405
c -0.087776  1.718656 -0.490695
取行標簽索引為b的一行數(shù)據(jù):
A   -1.443032
B    1.114718
C    0.449405
Name: b, dtype: float64
取行標簽索引為a到c的三行數(shù)據(jù):
          A         B         C
a  0.284014  1.053296  0.529340
b -1.443032  1.114718  0.449405
c -0.087776  1.718656 -0.490695
  • 增加一列
import pandas as pd
import numpy as np

data = {'A': pd.Series(np.random.randn(3), index=['a','b','c']),
        'B': pd.Series(np.random.randn(3), index=['a','b','c'])}


df = pd.DataFrame(data)

df['C'] = df['A'] * df['B']

print(df)

OUT:
          A         B         C
a  1.785824  0.823041  1.469807
b  0.252471 -0.756140 -0.190903
c  0.111340  1.352880  0.150629
  • 刪除一列
import pandas as pd
import numpy as np

data = {'A': pd.Series(np.random.randn(3), index=['a','b','c']),
        'B': pd.Series(np.random.randn(3), index=['a','b','c'])}


df = pd.DataFrame(data)

df['C'] = df['A'] * df['B']

del df['A']

print(df)

OUT:
          B         C
a  0.172547 -0.128743
b -0.305665 -0.393696
c  2.006161 -2.865414
  • 篩選A列大于0的數(shù)據(jù)
import pandas as pd
import numpy as np

data = {'A': pd.Series(np.random.randn(3), index=['a','b','c']),
        'B': pd.Series(np.random.randn(3), index=['a','b','c'])}


df = pd.DataFrame(data)

df['C'] = df['A'] * df['B']
print(df)
print(df[df.A > 0])

OUT:
          A         B         C
a -1.166174 -0.651518  0.759784
b  0.889244 -0.199157 -0.177100
c -0.795640 -0.018516  0.014732
          A         B       C
b  0.889244 -0.199157 -0.1771

時間序列

import pandas as pd
import numpy as np

index = pd.date_range('01/01/2018', periods=8)


df = pd.DataFrame(np.random.randn(8, 3), index=index, columns=list('ABC'))

print(df)
OUT:
                   A         B         C
2018-01-01 -0.001183  0.749614  0.470705
2018-01-02 -0.900087 -3.067426 -1.840941
2018-01-03 -0.938453 -0.053678 -1.187395
2018-01-04  1.149277  0.266508  0.730095
2018-01-05  0.680196 -1.148432  1.066883
2018-01-06 -0.475393  0.493522 -1.730322
2018-01-07  0.554609 -1.553775  0.425781
2018-01-08  1.978791 -0.503719 -0.343008

okay, DataFrame的介紹就到這里判耕,希望你能跟我一起去學習透绩,去進步


歡迎關(guān)注我:「愛做飯的老謝」,老謝一直在努力...

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末壁熄,一起剝皮案震驚了整個濱河市帚豪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌草丧,老刑警劉巖狸臣,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異昌执,居然都是意外死亡烛亦,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門懂拾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來煤禽,“玉大人,你說我怎么就攤上這事岖赋∶使” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵唐断,是天一觀的道長选脊。 經(jīng)常有香客問我,道長脸甘,這世上最難降的妖魔是什么恳啥? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮斤程,結(jié)果婚禮上角寸,老公的妹妹穿的比我還像新娘菩混。我一直安慰自己忿墅,他們只是感情好扁藕,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著疚脐,像睡著了一般亿柑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上棍弄,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天望薄,我揣著相機與錄音,去河邊找鬼呼畸。 笑死痕支,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的蛮原。 我是一名探鬼主播卧须,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼儒陨!你這毒婦竟也來了花嘶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蹦漠,失蹤者是張志新(化名)和其女友劉穎椭员,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體笛园,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡隘击,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了研铆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闸度。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蚜印,靈堂內(nèi)的尸體忽然破棺而出莺禁,到底是詐尸還是另有隱情,我是刑警寧澤窄赋,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布哟冬,位于F島的核電站,受9級特大地震影響忆绰,放射性物質(zhì)發(fā)生泄漏浩峡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一错敢、第九天 我趴在偏房一處隱蔽的房頂上張望翰灾。 院中可真熱鬧缕粹,春花似錦、人聲如沸纸淮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咽块。三九已至绘面,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間侈沪,已是汗流浹背揭璃。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留亭罪,地道東北人瘦馍。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像应役,于是被迫代替她去往敵國和親情组。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容