DataFrame
DataFrame是一种类似表格形式的二维数据结构,其数据是以行和列的表格方式排列的。
例如我们存储一个人的相关信息:
age name sex
0 22.0 Bob F
1 21.0 Tom F
2 NaN Andy M
上面就是一个简单的DataFrame,其中,name、age、sex分别为列标签,0、1、2分别为默认的行标签,创建的代码为:
lists = [{'name':'Bob','age':22,'sex':'F'},
{'name':'Tom','age':21,'sex':'F'},
{'name':'Andy','sex':'M'}]
df = pd.DataFrame(lists)
print(df)
上面的list存储着三个人的相关信息,每一项字典的key都是默认的列标签
创建
DataFrame可以通过pandas.DataFrame()函数创建
# data : 数据源,ndarray、series、map、lists、dict、常量或者另一个DataFrame
# index : 行标签,默认为np.arrange(n)
# columns : 列标签,默认为np.arrange(n)
# dtype : 指定数据类型,默认系统推断数据类型
# copy : 复制数据,默认为 Flase
pandas.DataFrame( data, index, columns, dtype, copy)
通过 lists 创建
a. 简单一维数组
# 创建一个字符串数组
lists = ['Bob','Tom','Andy']
# 传入数据
df = pd.DataFrame(lists)
print(df)
'''
0
0 Bob
1 Tom
2 Andy'''
因为行标签index和columns都没有指定,因此使用了默认的np.arrange(n)
b. 二维数组
lists = [['Bob',25],['Tom',23],['Andy',19]]
# 传入数据,并指定列标签
df = pd.DataFrame(lists, columns=['name','age'])
print(df)
'''
name age
0 Bob 25
1 Tom 23
2 Andy 19'''
这时参数columns的数组长度要和lists中的元素数组长度一致
c. ndarray二维数组
lists = np.arange(12).reshape(3,4)
df = pd.DataFrame(lists)
print(df)
'''
0 1 2 3
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
'''
通过较低纬度的 Series 来创建
s = pd.Series(['Bob','Tom','Andy'], index=['first','second','third'])
df = pd.DataFrame(s, columns=['name'])
print(df)
'''
name
first Bob
second Tom
third Andy
'''
通过 list的字典
# 注:元素必须具有相同的长度
dic = {'name':['Bob','Tom','Andy'],'age':[25,23,19],'sex':['F','F','M']}
# 传入数据并指定行索引
df = pd.DataFrame(dic, index=['row{}'.format(i) for i in np.arange(len(dic['name']))])
print(df)
'''
age name sex
row0 25 Bob F
row1 23 Tom F
row2 19 Andy M
'''
此外,字典中的值也可以是多种样式,但其中数组长度必须一致,常量填充最长长度
dic = {
'A':pd.Series(1, index=range(4)),
'B':26,
'C':pd.Timestamp('20190217'),
'D':np.arange(4)
}
df = pd.DataFrame(dic)
print(df)
'''
A B C D
0 1 26 2019-02-08 0
1 1 26 2019-02-08 1
2 1 26 2019-02-08 2
3 1 26 2019-02-08 3
'''
通过 字典列表
我们还可以通过字典列表来创建DataFrame,字典中的key会被视为列标签,所有字典中的唯一key都会成为列标签,没有则使用NaN值补齐
lists = [{'name':'Bob','age':25,'sex':'F'},
{'name':'Tom','age':23,'sex':'F'},
{'name':'Andy','sex':'M'}]
df = pd.DataFrame(lists)
print(df)
'''
age name sex
0 25.0 Bob F
1 23.0 Tom F
2 NaN Andy M
'''
也可以指定 列标签,若字典中缺少相关字段则默认填充 NaN, 标签数组决定了列是顺序
df = pd.DataFrame(lists, columns=['name','sex','age','height'])
print(df)
'''
name sex age height
0 Bob F 25.0 NaN
1 Tom F 23.0 NaN
2 Andy M NaN NaN
'''
也可以指定 行标签, 列标签也可以比字典中的少,虽然多的字段会被丢弃
df = pd.DataFrame(lists, index=['first','second','third'],columns=['name','sex'])
print(df)
'''
name sex
first Bob F
second Tom F
third Andy M
'''
增删操作
例子数据
index = pd.date_range('20190217', periods=7)
columns = list('ABCD')
df = pd.DataFrame(np.random.randn(7,4), index=index, columns=columns)
print(df)
'''
A B C D
2019-02-08 -2.028688 0.439382 -1.939392 -0.876227
2019-02-09 1.322120 1.722774 -0.825087 0.830235
2019-02-10 -0.296324 2.465106 1.084785 0.983708
2019-02-11 0.277785 0.935043 -0.299506 0.514187
2019-02-12 -2.089254 -0.275968 -1.466165 0.322209
2019-02-13 0.205912 -1.642673 -0.628401 -0.053906
2019-02-14 2.615111 0.871448 -0.428041 0.857018
'''
添加 列
df['E'] = 1
print(df)
'''
A B C D E
2019-02-08 -2.360552 0.064194 0.455912 1.067189 1
2019-02-09 1.172144 1.110124 -2.108127 -1.551015 1
2019-02-10 -1.481258 0.518018 0.592958 0.024791 1
2019-02-11 -0.388603 1.556626 1.176389 -0.126905 1
2019-02-12 0.809137 -0.049594 0.057527 0.690147 1
2019-02-13 -0.742054 -0.075211 -0.823174 0.220592 1
2019-02-14 -0.990349 -1.191461 1.572127 -0.480145 1
'''
删除 列
df.pop('E')
print(df)
'''
A B C D
2019-02-08 -0.448693 -1.974794 -0.041380 -1.595393
2019-02-09 1.724595 -0.096974 -0.026345 0.984426
2019-02-10 -0.203396 0.107673 0.532353 0.119386
2019-02-11 0.528793 2.050661 0.854727 -2.008437
2019-02-12 1.941374 -0.777696 -1.143443 -0.744675
2019-02-13 -1.072986 0.522539 1.263841 0.324437
2019-02-14 0.072737 -1.201634 -0.229115 -0.289056
'''
注:不像python内置的pop函数,这里的pop中的item是必填的
添加 行
df2 = pd.DataFrame(2, index=pd.date_range('20190217',periods=1), columns=columns, dtype=float)
df = df.append(df2)
print(df)
'''
A B C D
2019-02-08 1.501641 0.283082 0.498203 -0.962883
2019-02-09 0.300840 1.181264 1.048192 1.692875
2019-02-10 -0.151108 -0.938684 -1.097083 0.112622
2019-02-11 0.217315 0.601876 -0.063849 1.971134
2019-02-12 0.651812 -0.378796 -0.338030 0.337614
2019-02-13 -0.356199 -0.698849 2.245919 0.819013
2019-02-14 -0.852322 -0.499241 -1.497437 0.403296
2019-02-15 2.000000 2.000000 2.000000 2.000000
'''
我们给df数据中添加了一条数值为2的一行
那么如何删除 行 数据呢,下面我们介绍一下删除函数drop()
pandas.drop()
# albels:标签数组
# asxis:方向,1表示横向,0表示纵向
# index:要删除的行数组
# columns:要删除的列数组
drop(labels=None, axis=0, index=None, columns=None)
删除 列
a. 指定 列标签 columns
data = df.drop(columns=['A','D'])
print(data)
'''
B C
2019-02-08 0.659580 -0.915754
2019-02-09 0.533189 0.770098
2019-02-10 0.612976 -1.550603
2019-02-11 -0.461758 0.123775
2019-02-12 0.284651 0.590690
2019-02-13 1.054701 0.148838
2019-02-14 -0.581583 1.651076
2019-02-15 2.000000 2.000000
'''
b. 标签名 + 方向
data = df.drop(['A','C'], axis=1)
print(data)
'''
B D
2019-02-08 0.732953 -1.210247
2019-02-09 -0.808781 1.559428
2019-02-10 -0.889716 1.350781
2019-02-11 1.289531 -0.540922
2019-02-12 0.357992 -1.013138
2019-02-13 0.596719 -0.523584
2019-02-14 0.221423 0.690994
2019-02-15 2.000000 2.000000
'''
删除 行
a. 指定 行标签 index
data = df.drop(index=index[:3])
print(data)
'''
A B C D
2019-02-11 -0.960596 -1.658962 0.027986 -0.126117
2019-02-12 1.207873 0.045211 1.860603 1.392873
2019-02-13 0.247632 -1.467985 -1.564298 0.994310
2019-02-14 -1.455130 -0.525645 -0.173436 0.825248
2019-02-15 2.000000 2.000000 2.000000 2.000000
'''
b. 标签名 + 方向
data = df.drop(index[:3],axis=0)
print(data)
'''
A B C D
2019-02-11 -0.950032 2.295755 -0.045384 -0.369924
2019-02-12 -1.296856 0.083413 -0.518678 -0.683066
2019-02-13 -0.057576 0.574244 -0.194683 -0.778204
2019-02-14 0.824786 -0.083522 0.409716 1.212379
2019-02-15 2.000000 2.000000 2.000000 2.000000
'''
选择
例子数据
index = pd.date_range('20190217', periods=7)
columns = list('ABCD')
df = pd.DataFrame(np.random.randn(7,4), index=index, columns=columns)
标签函数 .loc
loc可以通过 DataFrame 中的标签来选取数据,第一个位置为行标签,第二个位置为列标签
a. 使用 行标签
data = df.loc['20190217']
print(data)
'''
A 0.172456
B -0.196708
C -0.358772
D 0.813195
Name: 2019-02-11 00:00:00, dtype: float64'''
b. 使用 列标签
data = df.loc[:,'A':'D']
print(data)
'''
A B C D
2019-02-11.172456 -0.196708 -0.358772 0.813195
2019-02-12 0.606509 -1.150471 -0.114394 -0.968890
2019-02-13 -0.223689 0.583463 0.862829 1.012615
2019-02-14 0.227347 0.643138 1.813924 -0.316260
2019-02-15 0.053666 0.388430 -0.174752 -0.711354
2019-02-16 -0.373851 0.811530 -0.602160 -0.775848
2019-02-17 -0.053576 0.986285 2.754268 -1.364663
'''
c. 行标签 + 列标签
data = df.loc['20190212':'20190213','B':]
print(data)
'''
B C D
2019-02-12 -0.196708 -0.358772 0.813195
2019-02-13 -1.150471 -0.114394 -0.968890
2019-02-14 0.583463 0.862829 1.012615
2019-02-15 0.643138 1.813924 -0.316260
'''
索引函数 .iloc
iloc是通过索引位置来选取数据的
a. 行索引
data = df.iloc[1:3]
print(data)
'''
A B C D
2019-02-12 0.606509 -1.150471 -0.114394 -0.968890
2019-02-13 -0.223689 0.583463 0.862829 1.012615
'''
b. 列索引
data = df.iloc[:,[2,3]]
print(data)
'''
C D
2019-02-11 -0.358772 0.813195
2019-02-12 -0.114394 -0.968890
2019-02-13 0.862829 1.012615
2019-02-14 1.813924 -0.316260
2019-02-15 -0.174752 -0.711354
2019-02-16 -0.602160 -0.775848
2019-02-17 2.754268 -1.364663
'''
c. 行索引 + 列索引
data = df.iloc[[1,3],[0,2]]
print(data)
'''
A C
2019-02-16 0.606509 -0.114394
2019-02-17 0.227347 1.813924
'''
网友评论