版权声明:本文为作者原创文章,可以随意转载,但必须在明确位置标明出处!!!
DataFrame是一个表格类型的数据结构,想当于一个二维的数组,只不过DataFrame是按列来存储的,每一列可以有不同的数据类型,但每一列智能有一种数据类型,你可以把它想象成一个关系型数据库表,DataFrame也可是认为是由多个Series组成的,所有DataFrame取出的每一列都是一个Series数据结构。
构建一个DataFrame数据结构可以有几种方法,可以是一位的字典类型的ndarrays、list、dicts、或Series等等。
Series字典结构构建一个DataFrame结构
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
从结果中可以看出key作为了列索引了,index作为行标签索引,没一列都是一个Series结构,NaN作为缺省值被填充在A列最后一个值已达到数据对齐的目的。如果我们为DataFrame指定了索引值,那么将安装索引值进行排序
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数据列索引中没有将会以缺省值填充。DataFrame既然是二维的数据结构那么它也能指定列索引。
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数据类型,你可以通过df.index取到行标签索引,通过df.columns取到列标签索引。
ndarrays&lists构建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
从列表字典类型构建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。
从元组字典类型构建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
从元组字典类型构建的DataFrame数据类型是一个多索引的数据结构类型,不过思想都是一样的key作为列索引,值里面的key作为行索引。关于多个索引将会在后面介绍。
列的选取、增加、删除、筛选
- 选取一列
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的一行数据:\n%s' % df.iloc[1])
print('取行索引为1,2的两行数据:\n%s' % df.iloc[1:])
# 按行标签索引
print('取行标签索引为b的一行数据:\n%s' % df.loc['b'])
print('取行标签索引为a到c的三行数据:\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的一行数据:
A -1.443032
B 1.114718
C 0.449405
Name: b, dtype: float64
取行索引为1,2的两行数据:
A B C
b -1.443032 1.114718 0.449405
c -0.087776 1.718656 -0.490695
取行标签索引为b的一行数据:
A -1.443032
B 1.114718
C 0.449405
Name: b, dtype: float64
取行标签索引为a到c的三行数据:
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的数据:
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的介绍就到这里,希望你能跟我一起去学习,去进步