pythondataframe
⑴ python怎么对dataframe进行操作
用pandas中的DataFrame时选取行或列:
import numpy as npimport pandas as pdfrom pandas import Sereis, DataFrameser = Series(np.arange(3.))data = DataFrame(np.arange(16).reshape(4,4),index=list('abcd'),columns=list('wxyz'))data['友李w'] #选择表格中的'w'列,使用类字典属性,返回的是Series类型data.w #选择表格中的'w'列,使用点属性,返回的是Series类型data[['w']] #选择表格中的'w'列,返回的是DataFrame类型data[['w','z']] #选择表格中的'w'、'z'列data[0:2] #返回第1行到第2行的所有行,前闭后开,包括前不包括后data[1:2] #返回第2行,从0计,返回的是单行,通过有前后值的索引形式,
#如果采用data[1]则报错data.ix[1:2] #返回第2行的第三种方法,返回的是DataFrame,跟data[1:2]同data['a':'b'] #利用index值进行切片,返回的是**前闭后闭**的DataFrame,
#即末端是包含的
data.irow(0) #取data的第一行data.icol(0) #取data的第森昌一列data.head() #返回data的前几行数据,默认为前五行,需要前十行则data.head(10)data.tail() #返回data的后几行数据,默认为后五行,需要后十行则data.tail(10)ser.iget_value(0) #选取ser序列中的第一个ser.iget_value(-1) #选取ser序列中的最后一个,这种轴索引包含索引器的series不能采用ser[-1]去获取最后一个,这会引起歧义。data.iloc[-1] #选取DataFrame最后一行,返回的是Seriesdata.iloc[-1:] #选取DataFrame最后一行,返回的是DataFramedata.loc['a',['w','x']] #返回‘a’行'w'、'x'列,这种用于选取行索引列索引已知好春迟data.iat[1,1] #选取第二行第二列,用于已知行、列位置的选取。04142
下面是简单的例子使用验证:
import pandas as pdfrom pandas import Series, DataFrame
import numpy as np
data = DataFrame(np.arange(15).reshape(3,5),index=['one','two','three'],columns=['a','b','c','d','e'])
data
Out[7]:
a b c d eone 0 1 2 3 4two 5 6 7 8 9three 10 11 12 13 14#对列的操作方法有如下几种data.icol(0) #选取第一列E:\Anaconda2\lib\site-packages\spyder\utils\ipython\start_kernel.py:1: FutureWarning: icol(i) is deprecated. Please use .iloc[:,i] # -*- coding: utf-8 -*-Out[35]:
one 0two 5three 10Name: a, dtype: int32
data['a']
Out[8]:
one 0two 5three 10Name: a, dtype: int32
data.aOut[9]:
one 0two 5three 10Name: a, dtype: int32
data[['a']]
Out[10]:
aone 0two 5three 10data.ix[:,[0,1,2]] #不知道列名只知道列的位置时Out[13]:
a b cone 0 1 2two 5 6 7three 10 11 12data.ix[1,[0]] #选择第2行第1列的值Out[14]:
a 5Name: two, dtype: int32
data.ix[[1,2],[0]] #选择第2,3行第1列的值Out[15]:
atwo 5three 10data.ix[1:3,[0,2]] #选择第2-4行第1、3列的值Out[17]:
a ctwo 5 7three 10 12data.ix[1:2,2:4] #选择第2-3行,3-5(不包括5)列的值Out[29]:
c dtwo 7 8data.ix[data.a>5,3]
Out[30]:
three 13Name: d, dtype: int32
data.ix[data.b>6,3:4] #选择'b'列中大于6所在的行中的第4列,有点拗口Out[31]:
dthree 13data.ix[data.a>5,2:4] #选择'a'列中大于5所在的行中的第3-5(不包括5)列Out[32]:
c dthree 12 13data.ix[data.a>5,[2,2,2]] #选择'a'列中大于5所在的行中的第2列并重复3次Out[33]:
c c cthree 12 12 12#还可以行数或列数跟行名列名混着用data.ix[1:3,['a','e']]
Out[24]:
a etwo 5 9three 10 14data.ix['one':'two',[2,1]]
Out[25]:
c bone 2 1two 7 6data.ix[['one','three'],[2,2]]
Out[26]:
c cone 2 2three 12 12data.ix['one':'three',['a','c']]
Out[27]:
a cone 0 2two 5 7three 10 12data.ix[['one','one'],['a','e','d','d','d']]
Out[28]:
a e d d done 0 4 3 3 3one 0 4 3 3 3#对行的操作有如下几种:data[1:2] #(不知道列索引时)选择第2行,不能用data[1],可以用data.ix[1]Out[18]:
a b c d etwo 5 6 7 8 9data.irow(1) #选取第二行Out[36]:
a 5b 6c 7d 8e 9Name: two, dtype: int32
data.ix[1] #选择第2行Out[20]:
a 5b 6c 7d 8e 9Name: two, dtype: int32
data['one':'two'] #当用已知的行索引时为前闭后闭区间,这点与切片稍有不同。Out[22]:
a b c d eone 0 1 2 3 4two 5 6 7 8 9data.ix[1:3] #选择第2到4行,不包括第4行,即前闭后开区间。Out[23]:
a b c d etwo 5 6 7 8 9three 10 11 12 13 14data.ix[-1:] #取DataFrame中最后一行,返回的是DataFrame类型,**注意**这种取法是有使用条件的,只有当行索引不是数字索引时才可以使用,否则可以选用`data[-1:]`--返回DataFrame类型或`data.irow(-1)`--返回Series类型Out[11]:
a b c d ethree 10 11 12 13 14data[-1:] #跟上面一样,取DataFrame中最后一行,返回的是DataFrame类型Out[12]:
a b c d ethree 10 11 12 13 14data.ix[-1] #取DataFrame中最后一行,返回的是Series类型,这个一样,行索引不能是数字时才可以使用Out[13]:
a 10b 11c 12d 13e 14Name: three, dtype: int32
data.tail(1) #返回DataFrame中的最后一行data.head(1) #返回DataFrame中的第一行78179180181182183184185186
最近处理数据时发现当pd.read_csv()数据时有时候会有读取到未命名的列,且该列也用不到,一般是索引列被换掉后导致的,有强迫症的看着难受,这时候dataframe.drop([columns,])是没法处理的,怎么办呢,
最笨的方法是直接给列索引重命名:
data6
Unnamed: 0 high symbol timedate 2016-11-01 0 3317.4 IF1611 18:10:44.82016-11-01 1 3317.4 IF1611 06:01:04.52016-11-01 2 3317.4 IF1611 07:46:25.52016-11-01 3 3318.4 IF1611 09:30:04.02016-11-01 4 3321.8 IF1611 09:31:04.0data6.columns = list('abcd')
data6 a b c ddate 2016-11-01 0 3317.4 IF1611 18:10:44.82016-11-01 1 3317.4 IF1611 06:01:04.52016-11-01 2 3317.4 IF1611 07:46:25.52016-11-01 3 3318.4 IF1611 09:30:04.02016-11-01 4 3321.8 IF1611 09:31:04.
重新命名后就可以用dataframe.drop([columns])来删除了,当然不用我这样全部给列名替换掉了,可以只是改变未命名的那个列,然后删除。不过这个用起来总是觉得有点low,有没有更好的方法呢,有,可以不去删除,直接:
data7 = data6.ix[:,1:]1
这样既不改变原有数据,也达到了删除神烦列,当然我这里时第0列删除,可以根据实际选择所在的列删除之,至于这个原理,可以看下前面的对列的操作。
⑵ python对dataframe进行操作
建议参考一下dataframe文档,里面有相应的方法,不需要使用for循环遍历,for循环遍历会拖慢程序。对于dataframe中数据检索可以使用下面的方法。
【全部】df.values
【name列的数据】df['name'].values
【loc检索A列】df.loc['A']
【iloc进行行检索】df.iloc[0]
【直接使用名字进行列检索,但不适合行检索】df['name']
第一步:准备一些数据运行效果展示
完美运行,不用操心索引+1的问题,也不用再创建一个DataFrame实例!
希望能够采纳!
⑶ python数据分析2:DataFrame对象
DataFrame对象:二维表数据结构,由行列数据组成的表格
常用index表示行,columns表示列
'''
语文 数学 英语
0 110 105 99
1 105 88 115
2 109 120 130
'''
# print(df.columns) # Index(['语文', '数学', '英语'], dtype='object')
# print(df.index) # Int64Index([0, 1, 2], dtype='int64')
# 遍历DataFrame数据的每一列
'''
0 110
1 105
2 109
Name: 语文, dtype: int64
0 105
1 88
2 120
Name: 数学, dtype: int64
0 99
1 115
2 130
Name: 英语, dtype: int64
'''
1.创建一个DataFrame对象
pandas.DataFrame(data,index,columns,dtype,)
# data表示数据,可以是ndarray数组,series对象、列表、字典等
# index表示行标签(索引)
# columns表示列标签(索引)
# dtype每一列数据的数据类型
# 用于复制数据
# 返回值DataFrame
通过二维数组创建成绩表
'''
语文 数学 英语
0 110 105 99
1 105 88 115
2 109 120 130
'''
2.通过字典创建DataFrame对象
value值只能是一维数组或单个的简单数据类型
# 数组,则要求所有的数组长度一致
# 单个数据,每行都需要添加相同数据
'''
语文 数学 英语 班级
0 110 105 109 高一7班
1 105 88 120 高一7班
2 99 115 130 高一7班
'''
'''
【DataFrame属性】
values 查看所有元素的值 df.values
dtypes 查看所有元素的类型 df.dtypes
index 查看所有行名、重命名行名 df.index df.index=[1,2,3]
columns 查看所有列名、重命名列名 df.columns df.columns=['语','数']
T 行列数据转换 df.T
head 查看前n条数据,默认5条 df.head() df.head(10)
tail 查看后n条数据,默认5条 df.tail() df.tail(10)
shape 查看行数和列数,[0]表示行,[1]表示列 df.shape[0] df.shape[1]
info 查看索引,数据类型和内存信息 df.info
【DataFrame函数】
describe 查看每列的统计汇总信息,DataFrame类型 df.describe()
count 返回每一列中的非空值的个数 df.count()
sum 返回每一列和和,无法计算返回空值 df.sum()
max 返回每一列的最大值 df.max()
min 返回每一列的最小值 df.min()
argmax 返回最大值所在的自动索引位置 df.argmax()
argmin 返回最小值所在的自动索引位置 df.argmin()
idxmax 返回最大值所在的自定义索引位置 df.idxmax()
idxmin 返回最小值所在的自定义索引位置 df.idxmin()
mean 返回每一列的平均值 df.mean()
median 返回每一列的中位数 df.median()
var 返回每一列的方差 df.var()
std 返回每一列的标准差 df.std()
isnull 检查df中的空值,空值为True,否则为False,返回布尔型数组 df.isnull()
notnull 检查df中的空值,非空值为True,否则为False,返回布尔型数组 df.notnull()
中位数又称中值,是指按顺序排列的一组数据中居于中间位置的数
方差用于度量单个随机变量的离散程序(不连续程度)
标准差是方差的算术平方根,反映数据集的离散程度
'''
3. 导入.xls或.xlsx文件
# pandas.read_excel(io,sheetname=0,header=0,names=None,index_col=None,usecols=None,squeeze=False,dtype=None,engine=None,converters=None,true_values=None,false_values=None,skiprows=None,nrow=None,na_values=None,keep_defalut_na=True,verbose=False,parse_dates=False,date_parser=None,thousands=None,comment=None,skipfooter=0,conver_float=True,mangle_pe_cols=True,**kwds)
'''
io 字符串,xls或xlsx文件路径或类文件对象
sheet_name:None、字符串、整数、字符串行表或整数列表,默认值为0
字符串用于工作表名称;整数为索引,表示工作表位置
字符串行表或整数列表用于请求多个工作表,为None时则获取所有的工作表
sheet_name = 0 第一个Sheet页中的数据作为DataFrame对象
sheet_name = 1 第二个Sheet页中的数据作为DataFrame对象
sheet_name = 'Sheet1' 名为Sheet1的Sheet页中的数据作为DataFrame对象
sheet_name = [0,1,'Sheet3'] 第一个,第二个和名为Sheet3的Sheet页中的数据作为DataFrame对象
header:指定作为列名的行,默认值为0,即取第一行的值为列名。或数据不包含列名,则为header=None
names:默认值为None,要使用的列名列表
index_col:指定列为索引列,默认值为None,索引0是DataFrame对象的行标签
usecols:int、list或字符串,默认值为None
如为None,则解析所有列
如为int,则解析最后一列
如为list列表,则解析列号和列表的列
如为字符串,则表示以逗号分隔的Excel列字母和列范围列表
squeeze:布尔值,默认为False,如果解析的数据只包含一列,则返回一个Series
dtype:列的数据类型名称为字典,默认值为None
skiprows:省略指定行数的数据,从第一行开始
skipfooter:省略指定行数的数据,从尾部数的行开始
4.导入指定Sheet页的数据
# sheet_name=0表示第一个sheet页的数据,以此类推,如果不指定,则导入第一页
5.指定行索引导入Excel数据
'''
Empty DataFrame
Columns: []
Index: [1, 3, 5]
'''
# 导入第一列数据
'''
Empty DataFrame
Columns: []
Index: [1, 3, 5]
'''