DataFrame介绍
DataFrame是一种类似表格形式的二维数据结构,其数据是以行和列的表格方式排列的。
例如我们存储一个人的相关信息:
age name sex 0 25.0 Bob F 1 23.0 Tom F 2 NaN Andy M
上面就是一个简单的DataFrame,其中,name、age、sex分别为列标签,0、1、2分别为默认的行标签,创建的代码为:
lists = [{'name':'Bob','age':25,'sex':'F'}, {'name':'Tom','age':23,'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('20180508'),
'D':np.arange(4) } df = pd.DataFrame(dic) print(df) ''' A B C D 0 1 26
2018-05-08 0 1 1 26 2018-05-08 1 2 1 26 2018-05-08 2 3 1 26 2018-05-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('20180508', periods=7) columns = list('ABCD') df =
pd.DataFrame(np.random.randn(7,4), index=index, columns=columns) print(df) '''
A B C D 2018-05-08 -2.028688 0.439382 -1.939392 -0.876227 2018-05-09 1.322120
1.722774 -0.825087 0.830235 2018-05-10 -0.296324 2.465106 1.084785 0.983708
2018-05-11 0.277785 0.935043 -0.299506 0.514187 2018-05-12 -2.089254 -0.275968
-1.466165 0.322209 2018-05-13 0.205912 -1.642673 -0.628401 -0.053906 2018-05-14
2.615111 0.871448 -0.428041 0.857018'''
* 添加 列 df['E'] = 1 print(df) ''' A B C D E 2018-05-08 -2.360552 0.064194
0.455912 1.067189 1 2018-05-09 1.172144 1.110124 -2.108127 -1.551015 1
2018-05-10 -1.481258 0.518018 0.592958 0.024791 1 2018-05-11 -0.388603 1.556626
1.176389 -0.126905 1 2018-05-12 0.809137 -0.049594 0.057527 0.690147 1
2018-05-13 -0.742054 -0.075211 -0.823174 0.220592 1 2018-05-14 -0.990349
-1.191461 1.572127 -0.480145 1'''
* 删除 列 df.pop('E') print(df) ''' A B C D 2018-05-08 -0.448693 -1.974794
-0.041380 -1.595393 2018-05-09 1.724595 -0.096974 -0.026345 0.984426 2018-05-10
-0.203396 0.107673 0.532353 0.119386 2018-05-11 0.528793 2.050661 0.854727
-2.008437 2018-05-12 1.941374 -0.777696 -1.143443 -0.744675 2018-05-13
-1.072986 0.522539 1.263841 0.324437 2018-05-14 0.072737 -1.201634 -0.229115
-0.289056'''
注:不像python内置的pop函数,这里的pop中的item是必填的
* 添加 行 df2 = pd.DataFrame(2, index=pd.date_range('20180515',periods=1),
columns=columns, dtype=float) df = df.append(df2) print(df)''' A B C D
2018-05-08 1.501641 0.283082 0.498203 -0.962883 2018-05-09 0.300840 1.181264
1.048192 1.692875 2018-05-10 -0.151108 -0.938684 -1.097083 0.112622 2018-05-11
0.217315 0.601876 -0.063849 1.971134 2018-05-12 0.651812 -0.378796 -0.338030
0.337614 2018-05-13 -0.356199 -0.698849 2.245919 0.819013 2018-05-14 -0.852322
-0.499241 -1.497437 0.403296 2018-05-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 2018-05-08 0.659580
-0.915754 2018-05-09 0.533189 0.770098 2018-05-10 0.612976 -1.550603 2018-05-11
-0.461758 0.123775 2018-05-12 0.284651 0.590690 2018-05-13 1.054701 0.148838
2018-05-14 -0.581583 1.651076 2018-05-15 2.000000 2.000000'''
b. 标签名 + 方向
data = df.drop(['A','C'], axis=1) print(data) ''' B D 2018-05-08 0.732953
-1.210247 2018-05-09 -0.808781 1.559428 2018-05-10 -0.889716 1.350781
2018-05-11 1.289531 -0.540922 2018-05-12 0.357992 -1.013138 2018-05-13 0.596719
-0.523584 2018-05-14 0.221423 0.690994 2018-05-15 2.000000 2.000000'''
* 删除 行
a. 指定 行标签 index
data = df.drop(index=index[:3]) print(data) ''' A B C D 2018-05-11 -0.960596
-1.658962 0.027986 -0.126117 2018-05-12 1.207873 0.045211 1.860603 1.392873
2018-05-13 0.247632 -1.467985 -1.564298 0.994310 2018-05-14 -1.455130 -0.525645
-0.173436 0.825248 2018-05-15 2.000000 2.000000 2.000000 2.000000'''
b. 标签名 + 方向
data = df.drop(index[:3],axis=0) print(data) ''' A B C D 2018-05-11 -0.950032
2.295755 -0.045384 -0.369924 2018-05-12 -1.296856 0.083413 -0.518678 -0.683066
2018-05-13 -0.057576 0.574244 -0.194683 -0.778204 2018-05-14 0.824786 -0.083522
0.409716 1.212379 2018-05-15 2.000000 2.000000 2.000000 2.000000'''
选择
例子数据
index = pd.date_range('20180508', periods=7) columns = list('ABCD') df =
pd.DataFrame(np.random.randn(7,4), index=index, columns=columns)
* 标签函数 .loc
loc可以通过 DataFrame 中的标签来选取数据,第一个位置为行标签,第二个位置为列标签
a. 使用 行标签
data = df.loc['20180508'] print(data) ''' A 0.172456 B -0.196708 C -0.358772 D
0.813195 Name: 2018-05-08 00:00:00, dtype: float64'''
b. 使用 列标签
data = df.loc[:,'A':'D'] print(data) ''' A B C D 2018-05-08 0.172456 -0.196708
-0.358772 0.813195 2018-05-09 0.606509 -1.150471 -0.114394 -0.968890 2018-05-10
-0.223689 0.583463 0.862829 1.012615 2018-05-11 0.227347 0.643138 1.813924
-0.316260 2018-05-12 0.053666 0.388430 -0.174752 -0.711354 2018-05-13 -0.373851
0.811530 -0.602160 -0.775848 2018-05-14 -0.053576 0.986285 2.754268 -1.364663'''
c. 行标签 + 列标签
data = df.loc['20180508':'20180511','B':] print(data) ''' B C D 2018-05-08
-0.196708 -0.358772 0.813195 2018-05-09 -1.150471 -0.114394 -0.968890
2018-05-10 0.583463 0.862829 1.012615 2018-05-11 0.643138 1.813924 -0.316260'''
* 索引函数 .iloc
iloc是通过索引位置来选取数据的
a. 行索引
data = df.iloc[1:3] print(data) ''' A B C D 2018-05-09 0.606509 -1.150471
-0.114394 -0.968890 2018-05-10 -0.223689 0.583463 0.862829 1.012615'''
b. 列索引
data = df.iloc[:,[2,3]] print(data) ''' C D 2018-05-08 -0.358772 0.813195
2018-05-09 -0.114394 -0.968890 2018-05-10 0.862829 1.012615 2018-05-11 1.813924
-0.316260 2018-05-12 -0.174752 -0.711354 2018-05-13 -0.602160 -0.775848
2018-05-14 2.754268 -1.364663'''
c. 行索引 + 列索引
data = df.iloc[[1,3],[0,2]] print(data) ''' A C 2018-05-09 0.606509 -0.114394
2018-05-11 0.227347 1.813924'''
热门工具 换一换