首发于 数据分析

pandas (三)

对应官方文档: Essential basic functionality

属性和底层

1. df.shape 访问原始数据

2. 把字符串列名大小写转换:df.columns=[x.lower() for x in df.columns]

## 从series或者df中获得numpy数组:s.to_numpy(s) 或者 pd.asarray(s)

加速操作

> 使用numexpr和bottleneck加速某些类型的二进制数值和布尔运算。可以安装,使用,该加速模块默认使用,也可以禁用:

pd.set_option('compute.use_bottleneck', False)

pd.set_option('compute.use_numexpr', False)


1. 匹配和广播行为:

df所具备的方法,比如add,sub,mul,div,以及相关的功能:radd,rsub等,

可以直接在df上调用对应的函数,然后传入对应的参数,参数1为操作的数据,通过axis指定行还是列

df.sub(row,axis='columns/1' or 'index/0') 参数一可以是单个值,也可以是数组,如果是单个值,则所有的操作都使用该值操作,如果是数组,则对不同的列使用不同的值操作。

在上述方法中,可以指定参数:fill_value 查找操作的函数,如果只有一个为nan,则另一个为零,如果两个都为nan,则继续为nan

2. 灵活的比较

b比如eq,ne,lt,gt,le,ge

3. 布尔归约

比如empty,any,all 来概括一个布尔结果

比如(df>0).all() 对列时候大于零的布尔做聚合,输出为false,或者True,只要有一个值条件不符合,则输出false,只有在所有都符合的情况下,才会输出True。或者.any.any 结果输出之为True的

any:只要有一个值符合条件,就输出True。

通过empyt测试df时候为空。

是否为True:bool()

4. 比较对象是否等效

通过== 或者equlas来比较对象。

5. 比较阵列状物体。

pd.series或者pd.index和单个元素的比较通过 == 来比较,如果等于则输出True

只能是相同长度的对象之间比较,如果长的不一样,则会报错。

np可以不同长度之间比较。

6. 合并重叠的数据集。

通过combine_first 函数,来合并两个df,其中一个df的缺失值有条件的填充至另一个df的值。会合并两个df的值,会填充对应同列名的值

7. 通用df组合

8. 描述性统计

比如sum,mean,quantile,cumsum,cumprod

参数:axis,默认为0,根据列输出相对于的值。axis=1时,则输出行对应的值

参数:skipna 是否排除丢失的数据 默认为True排除,如果设置为Flase,则计算会出错,结果为nan

标准化:df-df.mean() 再除以df.std 得到的结果为数据零均差以及标准差为1.

函数如下:

1. count 非na统计值的数量

2. sum 值的总和

3. mean 均值

4. mad 平均绝对偏差

5. median 算术值中位数

6. min 最小值

7. mode

8. abs 绝对值

9. prod

10. std 贝塞尔校正的样本标准偏差

11. var 无偏方差

12. sem

13. cumsum 累计

14. cum max

15.cummin

series.nunique(0 会返回series中的唯一非nan值的数量。

9. 汇总数据:描述

describe函数:返回各种数据的汇总函数的信息比如,max,min,count,std,mean

还可以自定义该函数返回的信息:

比如自定义: .describe(precentiles=[.05,.25,.75,.95])

默认情况下,始终包含中位数。如果是非数字,则非统计输出一些唯一值以及最常出现的值的数量。

如果是混合类型的df,则该函数,只会输出数字列的相关描述性统计信息。

或者通过参数include/exclude 指定描述性统计的信息。值可以为:object/number/all

10. 最大/最小值索引

函数idxmin,和idxmax 返回最小/最大值的索引。

axis=0 为列,axis=1 为行。如果设置为0列,则返回对应值的index,如果设置axis=1行,则返回对应列名。当有多个最小或者最大值时,返回最开始匹配到的值

11. 值计数,直方图

统计相同值出现的次数:s.value_counts() /pd.value_counts(data)

通过mode 函数,返回出现最频繁的值,如果有多个,则返回多个。s.mode,df.mode()

12. 离散和quantiling

cut() 离散连续值

qcut 计算样本分位数。

13. 行或列的apple函数

df.apply(np.mean) 在df中的每一个元素上,应用mean函数,返回每一列的mean值,axis=1为行,axis=0为列,默认为列。

其他语法及函数:df.apply(lambda x:x.max()-x.min());df.apply(np.cumsum);df.apply(np.exp);df.apply('mean');df.apply(lambda x:x.idxmax())该函数返回最大值的index

或者可以自定义函数,应用到apple函数中:df.apply(method_name,args='',agrs2='')

14. 聚合agg函数

df.agg(np.sum) 等同于apply

df.agg('sum')

或者可以在函数中传递多个聚合函数:df.agg(['sum','mean']);df.agg(['sum',lambda x:x.mean()])

或者自定义函数,并传递到agg函数中:df.agg(['sum'],my_method_name)

或者使用字典格式指定列名和函数名,完成不同列,使用不同的函数操作:df.agg({'columns1':'sum','columns2':'mean'})

或者不同列,完成不同个数的函数操作:df.agg({'columns1':['sum','mean'],'columns2':'min'}) 列没有指定的则输出nan

对于不同类型的df列,如果无法使用函数进行操作,则只会输出相应的有效的聚合。

通过agg实现和describe函数一样的操作:

> from functools import partial

q_25=partial(pd.Series.quantile,q=0.25)

q_25.__name__='25%'

q_75=partial(pd.Series.quantile,q=0.75)

q_75.__name__='75%'

df.agg(['count','mean','std','min',q_25,'median',q_75,'max'])

15. 转换

transform 返回一个索引与原始索引相同的对象。api和agg类似。

df.transform(np.abs)

df.trnasform('abs')

df.transform(lambda x:x.abs())

np.abs(df)

df.transform([np.abs,lambda x:x+1]) 返回两列,一列为原始值,第二列为lambda的值

df.transfomr({'colums1':np.abs,'columns2':lambda x:x+1}) 对不同的列使用不同的函数

16. 应用元素函数

applymap函数:可以在series上,接受单个参数并且返回单个值的函数。

map函数:可以使用map函数完成映射的操作,把series中的值映射成其他的值:

定义一个sereis s=pd.Series(['six','seven','six','seven'],index=['a','b','c','d'])

道义映射的map t=pd.Series({'six':6.,"seven":7})

调用map函数: s.map (t)

17.reindex

完成的功能包括:重新排序现有数据以匹配一组新标签;如果index缺少数据,则为缺失值nan,

如:s.reindex(['','','']) 参数为下标,如果在原始集合中,没有该下标,则使用nan填充。

在df中也可以使用该函数:参数 index 为index,如果不存在则nan,columns:列名,可以重置列名顺序,不存在则为nan。也可以指定axis来设置是行还是列,axis=1为行,0为列。

或者可以使用其他series/df中 index, s.reindex(df.index)

重新索引时填充

reindex函数还可以指定method参数,表示对缺失值填充的方式

值: ffill:使用前一个值填充;bfill:使用后一个不为nan的值填充;nearest:使用最近的值填充。

或者使用fillna函数可以到达类似的效果:fillna(method='ffill')

参数:limit 限定指定连续匹配的最大数量,比如如果出现连续的nan值,则可以设定最大连续设置的值的个数,防止出现过多的一样的值。

18. 对比彼此对齐align

align:返回两个对象是否值相等。通过index相比较。

可以指定参数 join,连接的方式:outer 并集 默认;left,right,inner交集

outer为,在一方不存在的为nan

如果是df,则同时应用于索引和列,或者可以指定参数axis=0 仅在轴/行上对齐。

19. 从轴上删除标签

df.drop(['',''],axis=0) 删除指定index的行

df.drop(['',''],axis=1) 删除指定列名的列。

20. 重命名/映射标签

s.rename(str.upper)

df的重命名:df.rename(columns={'':'',"":""},index={'':'',"":""})

df.rename({'':'','':''},axis='columns') 重命名列名

df.rename({'':'','':''},axis='index') 重命名行名

参数:inplace 是否作用于原始数据集,默认为False,不操作原始数据集,可以设置为True。

21. 迭代

在series上迭代,非被视为类似于数组,在df上类似于dict,在键上进行迭代。

df使用for循环,返回单个对象,对象为列名

其他循环:iterrows ;itertuples 比iterrows快,

遍历df通常比较慢,可以使用其他的方式对df做操作,比如内置方法或者numpy函数,或者是apply

不要修改要迭代的内容。

22. items()

label 为列名 ser为index和列值。

for label,ser in df.items()

23. iterrows

将df的行作为series为对象进行迭代,返回一个迭代器,包括每个index索引和包含一行数据的series。series的index为列名,值为某一行的所有值

24. itertuples

为df中的每一行生成一个namedtuple,元组的第一个元素是该行的索引值,其他的为行值

语法:for row in df.itertuples() 通过row下标访问值 row[0],row[1]

25. dt

series的类型为datetime/period 则可以通过dt访问各种时间

s.dt.hour

s.dt.second

s.dt.day

s[s.dt.day==2] 条件筛选出对于天/分钟的数据。

格式化时间:s.dt.strftime('%Y%m%d')

支持dt的类型: .data_range('20201212 09:23:23') .period_range('20201212')

.timedelta_range('1 day 00:00:05')

26. 字符串函数

series的字符串函数,可以对其中的每一个元素进行访问,非排除丢失和nan值

s.str.lower()

还有其他的正则表达式

27. 排序

按索引怕徐,按列值排序,以及两者的结合。

通过index排序:df.sort_index() 默认升序排序;指定参数ascending=False 为降序排序

值排序:df.sort_vlaues(by='columns_nama')

通过多列排序:df.sort_values(by=['coumns_1','columns_2'])

将处理过后的值再排序:s.sort_values(key=lambda x: x.str.lower())

参数:na_postition='first' nan值会排序到前面显示

搜索排序:searchsorted()

28. 最大/最大的n个值

s.nsmallest(3) 最小的n个值

s.nlargest(3) 最大的n个值

df.nlargest(3,'columns_name')

df.nlargest(5,['columns_name1','columns_name2'])

df.nsmallest(3,'coulumns_name')

df.nsmallest(3,['',''])

29. copy 复制

在pandas中,继续可以不用做到复制对象,可以通过其他的方式做到复制的对象:插入,删除或者修改列;分配给index或columns属性;对于同类型的数据,可以通过values属性直接修改值。

30. dtypes

df.dtypes.value_counts() 统计不同类型出现的次数。

31. 类型

astype 将一个类型转换为另一个,默认情况下,即使dtype不变,也将返回一个副本,

语法: df.astype('float32');df[['columns1','columns2']]=df[['','']].astype(np.uint8)

通过dict字典转换列类型:df.astype({'columns':np.bool,'columns2':np.float64}

32. 对象转换

使用df.infer_objects() s.infer_ojects() 在值正确存储的前提下,会根据值的类型存储为相应的类型。

其他to_dtype函数:

转换为数字:pd.to_numeric(m)

转换为日期:pd.to_datetiem(m)

转换为timedelta对象:pd.to_timedelta(m)

参数:

errors:默认为如果转换过程中,存储的值不会,则会报错;设置为coerce,则会被忽略。如果设置为ignore,则无法转换为相应类型的值,将返回原始数据。

to_numeric 的参数:downcast,会将类型向下转换为较小的类型,节省内存。

以上这些值使用于一维数组,列表或者标量?通过使用apply将骑应用到每一列上。

语法:df.apply(pd.to_datetime)

33. 选择列

select_dtypes()

参数:include 选择那些列;exclude 选择不要哪些列。

选择bool列:df.select_dtypes(include=[bool]) 或者 include='bool'

选择所有数字和布尔列,排除无符号整数 df.select_dtype(include=['number','bool'],exclude=['unsignedinterger'])

选择字符串,使用object类型 include=['object']

查看numpy中所有的子类型:

通过遍历获得:

def subdtypes(dtype):

.....: subs = dtype.__subclasses__()

.....: if not subs:

.....: return dtype

.....: return [dtype, [subdtypes(dt) for dt in subs]]

subdtypes(np.generic)

发布于 2020-12-27 15:57

文章被以下专栏收录

    数据分析

    统计学理论,数据采集,清洗,集成,可视化,挖掘算法