700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Python数据分析:pandas中Dataframe的groupby与索引

Python数据分析:pandas中Dataframe的groupby与索引

时间:2021-12-03 00:19:53

相关推荐

Python数据分析:pandas中Dataframe的groupby与索引

任何关于算法、编程、AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主在线答疑~此外,公众号内还有更多AI、算法、编程和大数据知识分享,以及免费的SSR节点和学习资料。其他平台(知乎/B站)也是同名「图灵的猫」,不要迷路哦~

一、索引

Series和DataFrame都是有索引的,索引的好处是快速定位,在涉及到两个Series或DataFrame时可以根据索引自动对齐,比如日期自动对齐,这样可以省去很多事。

缺失值

pd.isnull(obj)obj.isnull()

将字典转成数据框,并赋予列名,索引

DataFrame(data, columns=['col1','col2','col3'...],index = ['i1','i2','i3'...])

查看列名

DataFrame.columns

查看索引

DataFrame.index

重建索引

obj.reindex(['a','b','c','d','e'...], fill_value=0]#按给出的索引顺序重新排序,而不是替换索引。如果索引没有值,就用0填充#就地修改索引data.index=data.index.map(str.upper)

列顺序重排(也是重建索引)

DataFrame.reindex[columns=['col1','col2','col3'...])`#也可以同时重建index和columnsDataFrame.reindex[index=['a','b','c'...],columns=['col1','col2','col3'...])

重建索引的快捷键

DataFrame.ix[['a','b','c'...],['col1','col2','col3'...]]

重命名轴索引

data.rename(index=str.title,columns=str.upper)#修改某个索引和列名,可以通过传入字典data.rename(index={'old_index':'new_index'},columns={'old_col':'new_col'})

查看某一列

DataFrame['state'] 或 DataFrame.state

查看某一行

需要用到索引

DataFrame.ix['index_name']

添加或删除一列

DataFrame['new_col_name'] = 'char_or_number'#删除行DataFrame.drop(['index1','index2'...])#删除列DataFrame.drop(['col1','col2'...],axis=1)#或del DataFrame['col1']

DataFrame选择子集

针对series

obj[['a','b','c'...]]obj['b':'e']=5

针对dataframe

#选择多列dataframe[['col1','col2'...]]#选择多行dataframe[m:n]#条件筛选dataframe[dataframe['col3'>5]]#选择子集dataframe.ix[0:3,0:5]

dataframe和series的运算

会根据 index 和 columns 自动对齐然后进行运算,很方便啊

#没有数据的地方用0填充空值df1.add(df2,fill_value=0)# dataframe 与 series 的运算dataframe - series规则是:-------- -------- ||| || ||| -------- ||| ||| v--------#指定轴方向dataframe.sub(series,axis=0)规则是:-------- --- || | | ----->|| | | || | | || | | -------- ---

apply函数

f=lambda x:x.max()-x.min()#默认对每一列应用dataframe.apply(f)#如果需要对每一行分组应用dataframe.apply(f,axis=1)

排序和排名

#默认根据index排序,axis = 1 则根据columns排序dataframe.sort_index(axis=0, ascending=False)# 根据值排序dataframe.sort_index(by=['col1','col2'...])#排名,给出的是rank值series.rank(ascending=False)#如果出现重复值,则取平均秩次#在行或列上面的排名dataframe.rank(axis=0)

描述性统计

唯一值,值计数,成员资格

obj.unique()obj.value_count()obj.isin(['b','c'])

处理缺失值

# 过滤缺失值# 只要有缺失值就丢弃这一行dataframe.dropna()#要求全部为缺失才丢弃这一行dataframe.dropna(how='all')# 根据列来判断dataframe.dropna(how='all',axis=1)# 填充缺失值#1.用0填充df.fillna(0)#2.不同的列用不同的值填充df.fillna({1:0.5, 3:-1})#3.用均值填充df.fillna(df.mean())# 此时axis参数同前面

二、Groupby

pandas提供了一个灵活高效的groupby功能,它使你能以一种自然的方式对数据集进行切片、切块、摘要等操作。根据一个或多个键(可以是函数、数组或DataFrame列名)拆分pandas对象。计算分组摘要统计,如计数、平均值、标准差,或用户自定义函数。对DataFrame的列应用各种各样的函数。应用组内转换或其他运算,如规格化、线性回归、排名或选取子集等。计算透视表或交叉表。执行分位数分析以及其他分组分析。

1)查看DataFrame数据及属性

df_obj = DataFrame() #创建DataFrame对象df_obj.dtypes #查看各行的数据格式df_obj['列名'].astype(int)#转换某列的数据类型df_obj.head() #查看前几行的数据,默认前5行df_obj.tail() #查看后几行的数据,默认后5行df_obj.index #查看索引df_obj.columns #查看列名df_obj.values #查看数据值df_obj.describe() #描述性统计df_obj.T #转置df_obj.sort_values(by=['',''])#同上

2)使用DataFrame选择数据:

df_obj.ix[1:3] #获取1-3行的数据,该操作叫切片操作,获取行数据df_obj.ix[columns_index] #获取列的数据df_obj.ix[1:3,[1,3]]#获取1列3列的1~3行数据df_obj[columns].drop_duplicates() #剔除重复行数据

3)使用DataFrame重置数据:

df_obj.ix[1:3,[1,3]]=1#所选位置数据替换为1

4)使用DataFrame筛选数据(类似SQL中的WHERE):

alist = ['023-18996609823']df_obj['用户号码'].isin(alist) #将要过滤的数据放入字典中,使用isin对数据进行筛选,返回行索引以及每行筛选的结果,若匹配则返回turedf_obj[df_obj['用户号码'].isin(alist)] #获取匹配结果为ture的行

5)使用DataFrame模糊筛选数据(类似SQL中的LIKE):

df_obj[df_obj['套餐'].str.contains(r'.*?语音CDMA.*')] #使用正则表达式进行模糊匹配,*匹配0或无限次,?匹配0或1次

6)使用DataFrame进行数据转换(后期补充说明)

df_obj['支局_维护线'] = df_obj['支局_维护线'].str.replace('巫溪分公司(.{2,})支局','\\1')#可以使用正则表达式

可以设置take_last=ture 保留最后一个,或保留开始一个.补充说明:注意take_last=ture已过时,请使用keep=’last’

7)使用pandas中读取数据:

read_csv('D:\LQJ.csv',sep=';',nrows=2) #首先输入csv文本地址,然后分割符选择等等df.to_excel('foo.xlsx',sheet_name='Sheet1');pd.read_excel('foo.xlsx', 'Sheet1', index_col=None, na_values=['NA'])#写入读取excel数据,pd.read_excel读取的数据是以DataFrame形式存储df.to_hdf('foo.h5','df');pd.read_hdf('foo.h5','df')#写入读取HDF5数据

8)使用pandas聚合数据(类似SQL中的GROUP BY 或HAVING):

data_obj['用户标识'].groupby(data_obj['支局_维护线'])data_obj.groupby('支局_维护线')['用户标识'] #上面的简单写法adsl_obj.groupby('支局_维护线')['用户标识'].agg([('ADSL','count')])#按支局进行汇总对用户标识进行计数,并将计数列的列名命名为ADSL

9)使用pandas合并数据集(类似SQL中的JOIN):

merge(mxj_obj2, mxj_obj1 ,on='用户标识',how='inner')# mxj_obj1和mxj_obj2将用户标识当成重叠列的键合并两个数据集,inner表示取两个数据集的交集.

10)清理数据

df[df.isnull()]df[df.notnull()]df.dropna()#将所有含有nan项的row删除df.dropna(axis=1,thresh=3) #将在列的方向上三个为NaN的项删除df.dropna(how='ALL')#将全部项都是nan的row删除填充值df.fillna(0)df.fillna({1:0,2:0.5}) #对第一列nan值赋0,第二列赋值0.5df.fillna(method='ffill') #在列方向上以前一个值作为值赋给NaN

实例

1. 读取excel数据

代码如下

import pandas as pd# 读取高炉数据,注意文件名不能为中文data=pd.read_excel('gaolushuju_01-03.xlsx', '01', index_col=None, na_values=['NA'])print data

测试结果如下

燃料比 顶温西南 顶温西北 顶温东南 顶温东北0 531.46 185 176 176 1741 510.35 184 173 184 1882 533.49 180 165 182 1773 511.51 190 172 179 1884 531.02 180 167 173 1805 511.24 174 164 178 1766 532.62 173 170 168 1797 583.00 182 175 176 1738 530.70 158 149 159 1569 530.32 168 156 169 17110 528.62 164 150 171 169

2. 切片处理,选取行或列,修改数据

代码如下:

data_1row=data.ix[1]data_5row_2col=data.ix[0:5,[u'燃料比',u'顶温西南']print data_1row,data_5row_2coldata_5row_2col.ix[0:1,0:2]=3

测试结果如下:

燃料比510.35顶温西南 184.00顶温西北 173.00顶温东南 184.00顶温东北 188.00Name: 1, dtype: float64 燃料比 顶温西南0 531.46 1851 510.35 1842 533.49 1803 511.51 1904 531.02 1805 511.24 174燃料比 顶温西南0 3.0031 3.0032 533.49 1803 511.51 1904 531.02 1805 511.24 174

格式说明,data_5row_2col.ix[0:1,0:2],data_5row_2col.ix[0:1,[0,2]],选取部分行和列需加”[]”

3. 排序

代码如下:

print data_1row.sort_values()print data_5row_2col.sort_values(by=u'燃料比')

测试结果如下:

顶温西北 173.00顶温西南 184.00顶温东南 184.00顶温东北 188.00燃料比510.35Name: 1, dtype: float64燃料比 顶温西南1 510.35 1845 511.24 1743 511.51 1904 531.02 1800 531.46 1852 533.49 180

4. 删除重复的行

代码如下:

print data_5row_2col[u'顶温西南'].drop_duplicates()#剔除重复行数据

测试结果如下:

0 1851 1842 1803 1905 174Name: 顶温西南, dtype: int64

说明:从测试结果3中可以看出顶温西南index=2的数据与index=4的数据重复,测试结果4显示将index=4的顶温西南数据删除

5. 参考文献

10分钟搞定pandas

numpy+pandas series dataframe常用函数

python基础教程

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。