大数据基本公式——二:pandas

df.rename('a_name','b_name')

df.columns=(columns={'acolumn':'b-column'})

 

一:分组;分组,就是第一层查询条件我想

 

根据什么分组,它的index就是什么

df.groupby(df.animal)['weight'].mean()            df.animal这就是index________________________只要长度相同,就可以放到里面,太重要了,57课有说————

不加[]就是对所有列进行.mean()________  但是即使这样,还可以在后面加['xx']来取到

这个分组的组,可以是一列的名字,也可以是另一个

df对df中的animal进行分组,找出他们的weight,并求平均值.   如果不加weight就把所有能够计算的列mean了

df.groupby(['animal','size'])['weight'].mean()         如果有两个以上,就加到[]————也就有了两个index_所谓multi-index

data.unstack()                     将index进行一下置换,变成习惯性的index方式的df。针对multii_index也就是多index.内层index变成column___内层index变成column.形成一个小df

data.unstack(0)                    默认将内层index移到上面形成表格,也可变成外层,

data.stack                      与之相反

data.reset_index                   索引转换为数值 

data.set_index('aninal')                将哪一列变为index

data.columns['size','mean']              重命名columns的复杂方法       data.rename(columns={'size':'mean'}) 做一下映射,,想改哪个就哪个. data.rename(index={'dog':'gou'}

 

 

51课重要,重要,重要

data.groupby(['StartDay',''MemberType']).count()
data.groupby(['StartDay',''MemberType']).size()不考虑NaN值

根据什么分组,什么就会成为index.配合着上面的unstack进行调换

下面同上一起参考

 

二.透视表重新安排列和行

data.pivot_table(index,='mebertype',columns='startday',values='triptime',aggfunc=np.mean).             __________行是什么,列是什么,值是什么,方法是什 么

data.groupby(['StartDday','MemberType']).size().unstack().plot.bar(rot=30)

data.groupby(['StartDday','MemberType'])[' TripDurationSec'].mean().unstack().T.           _________同透视表:data.pivot_table(index='MemberType',columns='StartDay',values='TripDurationSec',aggfunc=np.mean)

所谓的透视表就是一种data.groupby(['StartDday','MemberType'])[' TripDurationSec'].mean().unstack().T的快捷方式

先告诉人家index和columl及value,以及怎么的aggfunc计算方式

交叉表:
pd.crosstab(index=data.MemberType,columns=data.StartDay)——————最常用的就是计数

快速度算两个项目的出现次数

 

 

 

时间索引(序列)DatetimeIndex

pd.to_datetime(xxx)

index=pd.date_range('2018-2-1','202=18-3-1')      开始-结束

index=pd.date_range('2018-2-1',periods=20)       到20天后

index = pd.date_range('2018.2.1', '2018.2.3', freq='5S')  每融5秒生成一个

index = pd.date_range('2018.2.1', '2018.12.31', freq='BM) 每月最后一个“工作日”

t['2012-1']                       如果是时间序列,直接就把一个月的提出来了

t['2012-1','2013-5']                  如果一个df是/时间序列,直接就把一个月的提出来了

 

重采样就是把从一个频率重新用另一个频率采样

降采样:

ts.resample('M')                    按月重采样

升采样:

设置时间序列:
data = pd.read_csv('./dataset/air1908.csv', index_col='Date', parse_dates=True) parse_dates=True是解析时间的意思

 

 

df = df.rename(columns={'村居书记(主任/负责人)': '村居书记_主任_负责人'})     修改名字

.map()         Series有map方法,里面可以对所有元素应用这个函数62课

s.mean()        series取均值

s.max() s.min()

'b' in s.index()       判断是否存在

s=pd.series({'a':1,'b':9,'c':4}) 用dict构造series_key就是index

s.isnull()         是不是NaN

df.isnotnull

data.info()                       针对列进行统计

data.describe()

np.unique(data)     返回该data的唯一值 

df.xxx.value_counts()

df.race.isin(['汉族'])

df.apply()

df.applymap()      对每一个元素应用函数

data.tail() 

 

 

df.lok[‘one’] 用索引

df['one':'three']                 用index进行切片时,最后一个值是包函的,和python的数组不一样

df.loc['one':'three',['a','b']]      取前三行,再取里面的前两列。   df.loc['one':'three',['a']]   后面也可以用切片  df.loc['one':'three',['a':'c']]  

df.loc[['one':'four'],['a','b']]      同上,如果只取两列,就要放在一个[]中,   

df.loc["three","b"]              前面是对行,后面是对列        重点:选范围就不放[] 用:来切,只先哪几行就要用[]括起来。     切片不括,

df.ilok[1:,0].    按行位置      不抱括最后一位                 也是先行后列,前面是表示行.  一句话loc索引,iloc位置 添加行,用loc(append)

df['d']=4.              赋值-添加列

df['d']=4       添加列              df.h=5这样不行,必须中【】

df['d']=np.arrange(4 )

df['d']=pd.Series([2,3,4,5])

del df['e']  删除           删除列的话会对原DF直接生效

df.loc['five']=10 添加

df.drop('one')        删除  用index当参数 df不变,返回个新的

df.drop(['four','five'])     两行就用list 

df.sum()             个数

data.isna()和isnull()       是否为NaN值

data.dropna()        series和df中都可以用好像,抛去NaN值__在df中只要有一个缺失值就会删

data.dropna(how='all')            全缺失就会.  data.dropna(how='any')删除任意有NaN的值

data.fillna({'aa':,np.nan,'bb':np.nan})

data[np.abs(data>3).any(1)] ___1代表行,axis=1_________太重要了,找出每一行数里有大于3的人

.any()就是这一行只要有一个为True时,就返回,有利于排查大的DF  any(1)应该是轴

.all()只有全部为true时才能返回

 

离散化分析,以分析段为主  哪个级别的粉丝数之类

pd.cut(data,bins=bins,right=false).   right这个管包不包括右边,——————categorys这是一种数据类型,专门用来分类57课

pd.cut(data,4)直接输入4就是分成4份

 

data.isnull().any()    把有null值的人找出来

data.dropna(subset=['location','type']).   抛有空的指定行

 

data.name.str.replace('beijing','shanghai')

————————drop也可以删除列   df.drop(coumns=['c','f']) ____默认是index

 

 下面我看还是看下面吧,省事,内容也不多

 

pandas以索引为准  series就是列  Dataframe就是表格 列索引是columns

26课   ————————

 

 s.index

s.value

s=pd.series([1,3,6,2],index=['a','b','c','d'])

'b' in s.index判断B这个INESX是否在index中

s=pd.series({'a':1,'b':9,'c':4})用字典方式构造series

27课

有index,肯定就是定义的index,但是值对不上的话就是NAN

s.isnull()

 取反就是~s.isnull()或者isnotnull()_______isnotnull()在series上不能用,只能在dataframe上用 

pandas的节片是前后都包括

列索引是columns

 用字典创建DataFrame

data=DataFrame({'a':[1,2,3,4],'b':list('abcd'),'c':9,'d':pd.Series([5,6,7,8])})

我理解健就是列,

data.columns列索引 data.index行索引

xuhao=['one','two','three','four']

df=pd.DataFrame(np.random.randn(4,3),index=xuhao,columns=['a','b','c'])

 

取单列用df['a']或df.b

取多列用df[['a','b']]______用list 又中括号返回多列

取一列返回series取多例返回DF

df.head()

df.tail()

df.values()

28课

loc['one']这样取一行就是一个series,将一行变成了竖着的series 列,将原来column表变成iindex

loc[['one','two']]双中括号取多行就恢复原来的了,取得还是DF

loc['one':'three']切片方式取——————节片不用双【】

loc['one':'three',['a','b']]________分成两部分,前面是行,后面是列

loc['one':'three','a':'c']________分成两部分,前面是行,后面是列,同上,后面也可以切片

总之:切片的时候,不需要将索引放在【】,要精准取就要放到【】

loc前面是行,后面是列

loc[:'three','b':]道理见上

df.iloc[1]按位置

df.iloc[1:]按位置

df.iloc[1:,0]

df.iloc[:2]______不包括这个2——————loc是按index取值 是包括最后一位的而ILOC就和python一样了

总之,一个按索引取值 ,一个按位置取值 

29课 增删改查

df['d']=4       添加列              df.h=5这样不行,必须中【】

df['d']=np.arrange(4 )

df['d']=pd.Series([2,3,4,5])

del df['e']  删除列         删除列的话会对原DF直接生效

df.loc['five']=10 添加行

df.drop('one')删除行  df不变,返回个新的

df.drop(['four','five'])两行就用list 

————————drop也可以删除列   df.drop(coumns=['c','f']) ____默认是index

 

30课

 data.sort_index(axis=1,ascending=false)根据索引进行排序_____产生新数据,原数据不变

  data.sort_index(axis=1,ascending=false,inplace=true)这就不一样了,立刻生效

data.seort_values(by='c') ascending=false就是降序的意思

data.reindex()   columns=['b','c','d','a']_____如果没有的值 ,会让那一列成为NaN值 ————对于series也可以用reindex

同时按照行和列进行对齐

np.mean(data)___如果对DF进行运算的话,默认是在行上进行计算   data.mean   data.sun(1)或 data.sun(0)——————对象方法

31课

 data.head()  data.tail()

data.info()  每一的情况

data.describe()常见汇总统计结果

data.idxmax(0)每行最大值索引

np.unique(data)返回该data的唯一值 

data.iloc[:,-1]取所有的行,取最后一列________后面用.unique() 方法取唯一

data.iloc[:,6].value_counts()

32课

成员关系判断

s.isin(['a','c']) ______一个大表里取出985的同学   

data.apply()在data上应用一个函数

data.apply(lamda x:x.max()-x.min(),axis=0) 指定在行上应用,还是在列上应用

data.applymap()对每一个元素运行这个函数      apply这种方法不是向量化的运算,所以速度会慢一些

33课

header=None 有表头就不加,没表头就加

data=pd.read_csv('./xxxx/xxx.txt',sep=''\t)————————分割

data.columns=["age","name","height","wight"]——————给没有column的加columns

data=pd.read_csv('./xxxx/xxx.txt',sep=''\t,sep='\t',header=None,names=["age","name","height","wight"])   直接添加列名

在read_csv()方法中,index_col比较有用,是指定某一列指定为index

34课,

保存的时候用index=False就不会加一列了

date.to_excel('./xxxx')保存为excel

pd.read_excel('./xxxx',sheetname=1)

pd.to_json('./xxxx')保存为json

data.type____用对象方式选一列

xxx.valut_count()返回一个series,——————然后.index就得到前10种机型

37课横向合并  

合并dataframe     pd.merge横向合并  

data=pd.merge(data1,data2,on='one') 横向合并,增加列 里面的one针对ONE这一列进行合并。——————针对one这一列进行交集合并 

案例中的意思是如果有两个表,一个是姓名年纪,一个是姓名身高,这种方式合并。这样相当于多加列。只保留共有的元素

data=pd.merge(data1,data2,how='outer') 并集————   inner是交集(默认)  left以左边为准同样right就是右边为准

data=pd.merge(data1,data2,left_on='one1',right_on='one2') 如果两个表的列都不一样,就要指定左边根据哪一列,右边根据哪一列

data=pd.merge(data1,data2,left_index='True',right_index='True',how='outer') 两边都要有true

data1.join(data2)快速合并,这种合并要求较高,用index合并,要求没有重叠的列

用谁来join就以谁为准,data2 如果没有就填充为

38 纵向合并

pd.assign(three=np.arange(6))    用来单独增加一列

纵向合并 concat([])  里面是个列表  pd.concat()默认是纵向合并,但参数调整后也可以横向合并

横向好像是用merge--61课有提

ignore_index=True 用了这个,就会用新的index相当于新数据了我想

39课 重复值 

data.duplicated()找到重复的布尔值 ___keep='first'

duplicate也可以加subset=['followers','name']之类.可以多加几个条件防止误删——————55课重要

(data.duplicated()).sun()   有几行是重复的呢

data.drop_duplicated()    ___data.drop_duplicated('k1')根据K1进行去重

data['k3']=1 给dataframe增加一列

data.drop_duplicated(['k1','k3'])  根据K1和K3去重————重要,根据几行的值决定去重

data.ki.replace('two','three') _____相当于在series上运行了replace方法
data.replace(1,100)把1替换成100,应该是在DF上所有的1

inplace=True一般在修改df的时候会返回一个新DF,但如果加了inplace=True就会让原来的DF立刻生效

40课

sum()运算

isnull() 和notnull()

data.dropna()            抛去所有NaN的值  比较极端

data.dropna(how='all')        所以用这个,只有全为NAN时才删除,这是另一种极端

data.dropna(subset=['location','type'])  这两行任何一个有NaN就抛弃drop掉  

如果删除全是NAN的列就用

data.dropna(axis=1,how='all')  列为1,行为0

data.isna()

df['column_name'].isna().any()     如果返回 True,说明该列中有 NaN 值。

填充缺失值 

data.fillna(0)

data.fillna({'aa':1,'bb':2}])选择列来填充NAN

data.fillna(data.mean())————————有一些数不能被抛弃的太厉害,所以用一些均值

day41 字符串方法

data.k1.str.replace('beijing','shanghai')

data.k1.str.s('')

strip()去空, split()分割   map方法 再看

42课,

.any()就是这一行只要有一个为True时,就返回,有利于排查大的DF  any(1)应该是轴

.all()只有全部为true时才能返回

np.sign()用得少

离散化分析————先定bins,这是划分标准,看看整 个数据的分段情况
data=pd.DataFrame(np.random.randint(1,100,(50,2)))

bins=[0,20,40,60,80,100]

cat=pd.cut(data.iloc[:,0],bins=bins,right=true)    right=true就是不包括右边的最大值 right=False就是左开右闭

下面是简写方式

cat=pd.cut(data.iloc[:,0],4)____简单分成4份___由最小的值到最大的值进行等分

cat=pd.qcut(data.iloc[:,0],4)

cat.value_counts()

43课

data.dropna(subset=['location','type']) 这两行任何一个有NaN就抛弃drop掉  

data.fillna(0)    .sum()的前面应该要用一个0

44课

 

取列用df['a']或df.b

取列用df['a']或df.b

 

posted @ 2024-10-21 16:25  青岛programmer  阅读(5)  评论(0编辑  收藏  举报