DataFrame相关常用操作(备忘、随时补充): series: Series 是一个一维数组对象 ,类似于 NumPy 的一维 array。它除了包含一组数据还包含一组索引,所以可以把它理解为一组带索引的数组。
创建: 创建一个简单的series实例:
1 2 3 4 import pandas as pda = [1 , 2 , 3 ] myser = pd.Series(a) print (myser)
运行结果为:
1 2 3 4 0 1 1 2 2 3 dtype: int64
左侧为索引,右侧为数据,下方显示数据类型int64。当没有显示指定索引的时候,Series 自动以 0 开始,步长为 1 为数据创建索引。
通过字典创建: 1 2 3 4 5 import pandas as pdsites = {1 : "Google" , 2 : "Runoob" , 3 : "Wiki" } myser = pd.Series(sites) print (myser)print (myser[2 ])
也可以设置index来选择哪几行被创建进series,设置name来设置名称:
1 2 3 4 5 6 7 8 9 10 11 12 import pandas as pdsites = {1 : "Google" , 2 : "Runoob" , 3 : "Wiki" } myser = pd.Series(sites,index=[1 ,2 ],name='hello' ) print (myser)print (myser[2 ])''' 1 Google 2 Runoob Name: hello, dtype: object Runoob '''
想要单独获取 Series 对象的索引或者数组内容的时候,可以使用 index 和 values 属性,例如:
1 2 3 4 5 6 7 8 9 10 import pandas as pdsites = {1 : "Google" , 2 : "Runoob" , 3 : "Wiki" } myser = pd.Series(sites,index=[1 ,2 ],name='hello' ) print (myser.index)print (myser.values)''' Int64Index([1, 2], dtype='int64') ['Google' 'Runoob'] '''
读取: 根据索引读取内容:
1 2 3 4 import pandas as pda = [1 , 2 , 3 ] myser = pd.Series(a) print (myser[1 ])
指定索引名称并通过指定的名称读取:
1 2 3 4 5 import pandas as pda = [1 , 2 , 3 ] myser = pd.Series(a,index=['x' ,'y' ,'z' ]) print (myser)print (myser['z' ])
赋值: 单独赋值:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import pandas as pdsites = {1 : "Google" , 2 : "Runoob" , 3 : "Wiki" } myser = pd.Series(sites,index=[1 ,2 ]) print (myser)myser[2 ]='baidu' print (myser) ''' 1 Google 2 Runoob dtype: object 1 Google 2 baidu dtype: object '''
对Series对象运算:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 import pandas as pdsites = {1 : 10 , 2 : 20 , 3 : 30 } myser = pd.Series(sites) print (myser)print (myser * 2 )print (myser * 2 + 1 )print (myser[myser > 15 ])''' 1 10 2 20 3 30 dtype: int64 1 20 2 40 3 60 dtype: int64 1 21 2 41 3 61 dtype: int64 2 20 3 30 dtype: int64 '''
转化为列表list:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import pandas as pdsites = {1 : 10 , 2 : 20 , 3 : 30 } myser = pd.Series(sites) print (myser)print (myser.values.tolist())print (myser.tolist())print (list (myser))''' 1 10 2 20 3 30 dtype: int64 [10, 20, 30] [10, 20, 30] [10, 20, 30] '''
series如果需要改变数据类型,for循环一个个改会导致一些问题,最好一列一起改。
DataFrame DataFrame 是一个表格型的数据结构。它提供有序的列和不同类型的列值。
创建: 例如将一个由 NumPy 数组组成的字典转换成 DataFrame 对象(ndarray 的长度必须相同, 如果传递了 index,则索引的长度应等于数组的长度。如果没有传递索引,则默认情况下,索引将是range(n),其中n是数组长度):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import pandas as pddata = { "name" : ["Carl" , "Peter" , "Lucy" , "Jobs" ], "age" : [30 , 40 , 20 , 33 ], "gender" : ["m" , "m" , "f" , "f" ], } frame = pd.DataFrame(data) print (frame)''' name age gender 0 Carl 30 m 1 Peter 40 m 2 Lucy 20 f 3 Jobs 33 f '''
想要指定列的顺序?传入一个列名的list即可:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import pandas as pddata = { "name" : ["Carl" , "Peter" , "Lucy" , "Jobs" ], "age" : [30 , 40 , 20 , 33 ], "gender" : ["m" , "m" , "f" , "f" ], } frame = pd.DataFrame(data, columns=["age" , "name" , "gender" ]) print (frame)''' age name gender 0 30 Carl m 1 40 Peter m 2 20 Lucy f 3 33 Jobs f '''
如果传入的列名找不到,它不会报错,而是产生一列 NaN 值
DataFrame 也可以列表的形式创建:
1 2 3 4 5 6 7 8 9 10 11 12 import pandas as pddata = [["Google" , 10 ], ["Runoob" , 12 ], ["Wiki" , 13 ]] df = pd.DataFrame(data, columns=["Site" , "Age" ], dtype=float ) print (df)''' Site Age 0 Google 10.0 1 Runoob 12.0 2 Wiki 13.0 '''
还可以使用字典(key/value),其中字典的 key 为列名,没有对应的部分数据为 NaN 。:
1 2 3 4 5 6 7 8 9 10 11 import pandas as pddata = [{"a" : 1 , "b" : 2 }, {"a" : 5 , "b" : 10 , "c" : 20 }] df = pd.DataFrame(data) print (df)''' a b c 0 1 2 NaN 1 5 10 20.0 '''
我们可以指定索引值,如下实例:
1 2 3 4 5 6 7 8 9 10 11 12 import pandas as pddata = {"calories" : [420 , 380 , 390 ], "duration" : [50 , 40 , 45 ]} df = pd.DataFrame(data, index=["day1" , "day2" , "day3" ]) print (df)''' calories duration day1 420 50 day2 380 40 day3 390 45 '''
DataFrame 某列不仅可以以字典索引的方式获取数据,还可以以属性的方法获取,例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import pandas as pddata = [{"a" : 1 , "b" : 2 , "c" : 3 }, {"a" : 5 , "b" : 10 , "c" : 20 }] df = pd.DataFrame(data) print (df)print (df.a)print (df['b' ])''' a b c 0 1 2 3 1 5 10 20 0 1 1 5 Name: a, dtype: int64 0 2 1 10 Name: b, dtype: int64 '''
修改、删除某一列:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import pandas as pddata = [{"a" : 1 , "b" : 2 , "c" : 3 }, {"a" : 5 , "b" : 10 , "c" : 20 }] df = pd.DataFrame(data) print (df)df.c=0 print (df)del df['c' ] print (df)''' a b c 0 1 2 3 1 5 10 20 a b c 0 1 2 0 1 5 10 0 a b 0 1 2 1 5 10 '''
读取 df[['a']] 和 df['a']
都能读取第一列数据,但它们的返回结果是不同的:
<class ‘pandas.core.frame.DataFrame’>
<class ‘pandas.core.series.Series’>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import pandas as pddata = [{"a" : 1 , "b" : 2 , "c" : 3 }, {"a" : 5 , "b" : 10 , "c" : 20 }] df = pd.DataFrame(data) print (df , "\n" )print (df[["a" ]] , "\n" )print (df["a" ] , "\n" )''' a b c 0 1 2 3 1 5 10 20 a 0 1 1 5 0 1 1 5 Name: a, dtype: int64 '''
读取单元格时:df[col][row]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import pandas as pddata = [{"a" : 1 , "b" : 2 , "c" : 3 }, {"a" : 5 , "b" : 10 , "c" : 20 }] df = pd.DataFrame(data) print (df , "\n" )print (df['a' ][1 ])print (df.b[0 ])''' a b c 0 1 2 3 1 5 10 20 5 2 '''
Pandas 可以使用 loc 属性返回指定行的数据,如果没有设置索引,第一行索引为0,第二行索引为1,以此类推:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import pandas as pddata = {"calories" : [420 , 380 , 390 ], "duration" : [50 , 40 , 45 ]} df = pd.DataFrame(data) print (df.loc[0 ])print (df.loc[1 ])print (df.loc[0 ].calories)''' calories 420 duration 50 Name: 0, dtype: int64 calories 380 duration 40 Name: 1, dtype: int64 420 '''
注意: 返回结果其实就是一个 Pandas Series 数据。
也可以返回多行数据,使用loc [[ … ]] 格式,… 为各行的索引,以逗号隔开:
1 2 3 4 5 6 7 8 9 10 11 12 import pandas as pddata = {"calories" : [420 , 380 , 390 ], "duration" : [50 , 40 , 45 ]} df = pd.DataFrame(data) print (df.loc[[0 ,1 ]])''' calories duration 0 420 50 1 380 40 '''
读取多行多列 .loc :
df.loc[[row1,row2],[col1,col2]]
df.loc[[row1,row2]][[col1,col2]]
df.loc[[ row1 , row3 ], firstCol : endCol]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 import pandas as pddata = [{"a" : 1 , "b" : 2 , "c" : 3 }, {"a" : 5 , "b" : 10 , "c" : 20 }] df = pd.DataFrame(data) print (df , "\n" )print (df.loc[[0 ,1 ]][['a' ,'b' ]],'\n' )print (df.loc[[1 ,0 ],['a' ,'b' ]])print (df.loc[[1 ,0 ],'a' :'c' ]) ''' a b c 0 1 2 3 1 5 10 20 a b 0 1 2 1 5 10 a b 1 5 10 0 1 2 a b c 1 5 10 20 0 1 2 3 '''
有时候我们可能更希望通过列号/行号(1,2,3…)读取数据而不是列名,又或着我们要读取多行的时候一个一个输入列名是很麻烦的,.iloc方法可以让我们通过列号索引数据,具体如下:
df.iloc[:,:1]读取第一列
df.iloc[:,1:3]读取第1列到第3列
df.iloc[:,2:]读取第2列之后的数据
df.iloc[:,:3]读取前3列数据
.iloc同样可以读取行号
.iloc[‘行号’]
.iloc[[‘行号’]]
.iloc[[‘行号1’,’行号2’,’行号n’]]
.iloc根据行号索引数据,行号是固定不变的,不受索引变化的影响,如果df的索引是默认值,则.loc和.iloc的用法没有区别,因为此时行号和行标签相同。如果从第0行开始读,则首位置可以省略,如果从某一行读到末尾,则尾位置可以省略。
df.iloc[:5],读取第0行到第4行的数据;
df.iloc[8:],读取第8行后所有数据,包括第8行;
df.iloc[3:6],读取第3行到第6行的数据,包括第3行但不包括第6行。
df.iloc[0,1],读取第0行第一列第数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 import pandas as pddata = [{"a" : 1 , "b" : 2 , "c" : 3 }, {"a" : 5 , "b" : 10 , "c" : 20 }] df = pd.DataFrame(data) print (df , "\n" )print (df.loc[[0 ,1 ]].iloc[:,2 ])print (df.loc[[1 ]].iloc[:,2 ])print (df.loc[[1 ]].iloc[0 ,2 ])''' a b c 0 1 2 3 1 5 10 20 0 3 1 20 Name: c, dtype: int64 1 20 Name: c, dtype: int64 20 '''
.ix的使用:link
对于一个pd.DataFrame,df.head(10)可以返回前10行,df.tail(10)可以返回最后10行。
一个画图常用的index的设置方法: 1.set_index
DataFrame可以通过set_index方法,可以设置单索引和复合索引。 DataFrame.set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False) append添加新索引,drop为False,inplace为True时,索引将会还原为列。
2.reset_index reset_index可以还原索引,重新变为默认的整型索引 DataFrame.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill=”) level控制了具体要还原的那个等级的索引 drop为False则索引列会被还原为普通列,否则会丢失
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import pandas as pddf7 = pd.DataFrame({'a' : 1 , 'b' : 2 }, index=[0 ]) df7.loc[1 ] = [3 , 4 ] print (df7)df7.set_index('a' , inplace=True ) print (df7)df7.reset_index(inplace=True ) print (df7) a b 0 1 2 1 3 4 b a 1 2 3 4 a b 0 1 2 1 3 4
3.reindex
•使用reindex方法重新排序和指定索引,会根据新索引重排数据
1 2 3 4 5 6 7 8 >>> students.reindex(index=['1850005' ,'1850004' ,'1850002' ,'1850001' , '1850003' ],columns=['姓名' ,'性别' ,'专业' ,'成绩' ]) 姓名 性别 专业 成绩 1850005 王丹 女 金融学 67 1850004 李明 男 交通工程 54 1850002 段霞 女 金融学 88 1850001 张海 男 交通工程 90 1850003 敬卫华 男 土木工程 91
DF对象的常用属性: 1 2 3 4 5 6 7 8 import pandas as pda = pd.DataFrame({"one" : pd.Series([1 , 2 , 3 ],index=['a' ,'b' ,'c' ]), "two" : [4 , 5 , 6 ]}) print (a.T)print (a.index)print (a.columns)print (a.values)print (a.describe())
结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 a b c one 1 2 3 two 4 5 6 Index(['a', 'b', 'c'], dtype='object') Index(['one', 'two'], dtype='object') [[1 4] [2 5] [3 6]] one two count 3.0 3.0 mean 2.0 5.0 std 1.0 1.0 min 1.0 4.0 25% 1.5 4.5 50% 2.0 5.0 75% 2.5 5.5 max 3.0 6.0
赋值操作: 按列赋值:
如果用一个列表或数组赋值,其长度必须和df的行数相同。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import pandas as pddata = [{"a" : 1 , "b" : 2 , "c" : 3 }, {"a" : 5 , "b" : 10 , "c" : 20 }] df = pd.DataFrame(data) print (df , "\n" )df.a=[33 ,44 ] print (df , "\n" )df['b' ]=0 print (df , "\n" )''' a b c 0 1 2 3 1 5 10 20 a b c 0 33 2 3 1 44 10 20 a b c 0 33 0 3 1 44 0 20 '''
按行赋值:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import pandas as pddata = [{"a" : 1 , "b" : 2 , "c" : 3 }, {"a" : 5 , "b" : 10 , "c" : 20 }] df = pd.DataFrame(data) print (df, "\n" )df.loc[1 ] = [33 , 44 , 55 ] print (df, "\n" )df.loc[[0 , 1 ]] = [[33 , 44 , 55 ], [66 , 77 , 88 ]] print (df, "\n" )''' a b c 0 1 2 3 1 5 10 20 a b c 0 1 2 3 1 33 44 55 a b c 0 33 44 55 1 66 77 88 '''
插入操作:
插入一列:
insert(ioc,column,value)
ioc:要插入的位置
colunm:列名
value:值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 import pandas as pddata = [{"a" : 1 , "b" : 2 , "c" : 3 }, {"a" : 5 , "b" : 10 , "c" : 20 }] df = pd.DataFrame(data) print (df, "\n" )df.insert(1 ,'d' ,[999 ,888 ]) print (df, "\n" )row={'a' :111 ,'d' :222 ,'b' :333 ,'c' :444 } df.loc[2 ]=row print (df, "\n" )''' a b c 0 1 2 3 1 5 10 20 a d b c 0 1 999 2 3 1 5 888 10 20 a d b c 0 1 999 2 3 1 5 888 10 20 2 111 222 333 444 '''
添加一行
old
df = df.append()
1 2 3 4 5 6 import pandas as pddata = [{"a" : 1 , "b" : 2 , "c" : 3 }, {"a" : 5 , "b" : 10 , "c" : 20 }] df = pd.DataFrame(data) df=df.append([{'a' :3 ,'b' :4 ,'c' :5 }],ignore_index=True ) print (df)
注意这里([{的顺序,还有ignore_index=True必须得加,不然index就成了0 1 0
输出结果为:
1 2 3 4 a b c 0 1 2 3 1 5 10 20 2 3 4 5
append()括号中同样可以用另一个dataframe对象,df.append(df2, ignore_index=True)
新版本中已将append方法删除:
DataFrame.append()
and Series.append()
have been deprecated and will be removed in a future version. Use pandas.concat()
instead (GH35407 ).
pd.concat()
拼接两个Series
1 2 3 4 5 6 7 8 import pandas as pds1 = pd.Series(['a' , 'b' ]) s2 = pd.Series(['c' , 'd' ]) s = pd.concat([s1, s2]) print (s, '\n' )s = pd.concat([s1, s2], ignore_index=True ) print (s, '\n' )
输出为:
1 2 3 4 5 6 7 8 9 10 11 0 a 1 b 0 c 1 d dtype: object 0 a 1 b 2 c 3 d dtype: object
拼接两个dataframe
1 2 3 4 5 6 7 import pandas as pddf1 = pd.DataFrame([[1 , 2 ], [3 , 4 ]], columns=['a' , 'b' ]) df2 = pd.DataFrame([[5 , 6 ], [7 , 8 ]], columns=['a' , 'b' ]) df = pd.concat([df1, df2], ignore_index=True ) print (df)
结果:
1 2 3 4 5 a b 0 1 2 1 3 4 2 5 6 3 7 8
如果有多出的列,则缺少的会被NaN填充
1 2 3 4 5 6 7 8 9 10 11 12 >>> df3 = pd.DataFrame([['c' , 3 , 'cat' ], ['d' , 4 , 'dog' ]],... columns=['letter' , 'number' , 'animal' ])>>> df3 letter number animal 0 c 3 cat1 d 4 dog>>> pd.concat([df1, df3], sort=False ) letter number animal 0 a 1 NaN1 b 2 NaN0 c 3 cat1 d 4 dog
如果只需要共有列,可以选择join=”inner”
如果需要横向拼接,可以设置axis = 1
增加单独一行:
1 2 3 4 5 6 7 8 9 10 11 12 13 >>> df7 = pd.DataFrame({'a' : 1 , 'b' : 2 }, index=[0 ])>>> df7 a b 0 1 2 >>> new_row = pd.Series({'a' : 3 , 'b' : 4 })>>> new_rowa 3 b 4 dtype: int64 >>> pd.concat([df7, new_row.to_frame().T], ignore_index=True ) a b 0 1 2 1 3 4
当然,也可以直接赋值:
1 2 3 df7 = pd.DataFrame({'a' : 1 , 'b' : 2 }, index=[0 ]) df7.loc[1 ] = [3 , 4 ] print (df7)
关于显示输出的问题
import pandas as pd
*#*显示所有列
pd.set_option(‘display.max_columns’, None)
*#*显示所有行
pd.set_option(‘display.max_rows’, None)
None可以写具体的数字,写多少就显示多少,默认是显示100行
import pandas as pd
pd.set_option(‘display.height’, 1000)
pd.set_option(‘display.max_rows’, 500)
pd.set_option(‘display.max_columns’, 500)
pd.set_option(‘display.width’, 1000)
类似的,对于numpy array print后不能完全显示输入下面代码:
numpy.set_printoptions(threshold = np.inf)
#若想不以科学计数显示 :
numpy.set_printoptions(suppress = True)