版權(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的介紹就到這里判耕,希望你能跟我一起去學習透绩,去進步