CSDN软件工程师能力认证(以下简称C系列认证)是由中国软件开发者网CSDN制定并推出的一个能力认证标准。C系列认证历经近一年的实际线下调研、考察、迭代、测试,并梳理出软件工程师开发过程中所需的各项技术技能,结合企业招聘需求和人才应聘痛点,基于公开、透明、公正的原则,甑别人才时确保真实业务场景、全部上机实操、所有过程留痕、存档不可篡改。
我们每天将都会精选CSDN站内技术文章供大家学习,帮助大家系统化学习IT技术。
写在前面pandas在数据处理分析上往往占据主要地位,其中实现了很多功能函数,可以使数据分析更加方便快捷,这里只是pandas中比较基础的总结,更加复杂高级的用法还需要参考官方文档。pandas中两个常用的对象是Series和DataFrame。
Series对象series是pandas中最基本的对象,并定义了和numpy.ndarray的接口,可以用numpy的函数直接操作series对象。series由两部分组成:index和values,index可看作一个索引,在创建series时可以指定index,若不指定,则会创建一个默认的index,values是保存元素值得narray数组。
s = pd.Series([1,2,3,4,5], index=["a","b","c","d","e"])
print s.index
print s.values
##
Index([u'a', u'b', u'c', u'd', u'e'], dtype='object')
[1 2 3 4 5]
series支持两种索引,一是如numpy.narray的索引类型,第二是这里的index索引。
print s[1]
print s["a"]
#
2
1
另外series也支持两种切片类型,两者的区别是使用数字索引时和numpy.narray的一样,但使用这里的index切片时,会包括起点和终点值。
print s[1:3]
print s["b":"d"]
##
b 2
c 3
dtype: int64
b 2
c 3
d 4
dtype: int64
series对象之间可以进行运算,在进行运算时会将元素对齐,如果长度不一样时,多余的部分结果时NaN,该值时浮点数中一个特殊值。
s2 = pd.Series([1,2,3,4,5,6], index=["a","b","c","d","e","f"])
s+s2
#
a 2.0
b 4.0
c 6.0
d 8.0
e 10.0
f NaN
dtype: float64
DataFrame对象
DataFrame是pandas中最常用的数据类型,同时提供了许多将其它数据结构转化为DataFrame的函数,并且提供了从许多不同类型文件直接读取数据并以DataFrame对象返回。DataFrame对象的基本结构如下图: DataFrame的同一列必须是同一类型数据,不同列可以是不同类型数据。通过[]+列索引来获取某一列,这是获取的类型是Series类型,当[]+列索引列表时将得到一个DataFrame类型。使用.loc[]将获得数据的某一行,返回的是Series类型,由于各列类型不一样,在获取时将会转换成通用的object类型,同样,为一个列表时将会时一个DataFrame类型。values属性将会把DataFrame转换成一个数组,由于数据类型不一样,所以最终仍时一个object类型的数组。
DataFrame可以通过三个参数来构造,data是数据,index行索引,columns列索引。data可以是二维数组、字典,当为字典是,key是行索引,value可以是一维数组、列表或者Series对象。
df1 = pd.DataFrame(np.random.randint(0,10,(4,2)),index=["a","b","c","d"], columns=["A","B"])
df2 = pd.DataFrame({"a":[1,2,3,4],"b":[5,6,7,8],index=["A","B","C","D"]})
arr = np.array([("i1",1),("i2",2),("i3",3),("i4",4)],dtype=[("name","10s"),("count",int)])
df3 = pd.DataFrame(arr)
此外还可以调用以 from_开头的类方法,将特定格式的数椐转换成 DataFrame对象。from_dict()将字典转换为DataFrame对象,其 orient参数可以指定字典键对应的方向,默认值为”columns”,表示把字典的键转换为列索引,即字典中的每个值与一列对应。而 orient参数为”index”时,字典中的每个值与一行对应。当字典为嵌套字典,即字典的值为字典时,另外一个轴的索引值由第二层字典屮的键决定。
dictl = {"a":[1, 2, 3], "b":[4, 5, 6]}
dict2 = {"a":{"A":1,"B":2}, "b":{"A":3, "C":4}}
dfl = pd.DataFrame.from_dict(dictl, orient="index")
df2 = pd.DataFrame.from_dict(dictl, orient="columns")
df3 = pd.DataFrame.from_dict(dict2, orient="index")
df4 = pd.DataFrame.from_dict(dict2, orient="columns")
###############################################################
from_items()将key-value序列转换为DataFrame对象,其中value是一维数据的列表、数组或Series对象,当orient指定为index时,需要指定columns索引。若不指定将产生错误。
df1 = pd.DataFrame.from_items(items,orient="index",columns=["A","B","C"])
A B C
a 1 2 3
b 4 5 6
#######################################
df2 = pd.DataFrame.from_items(items,orient="columns")
a b
0 1 4
1 2 5
2 3 6
将DataFrame转换为其它格式数据
to_dict将DataFrame对象转化为字典,其orient参数决定字典的元素的类型:
# records指定字典类型
df2.to_dict(orient="records")
[{'a': 1, 'b': 4}, {'a': 2, 'b': 5}, {'a': 3, 'b': 6}]
# list指定列表类型
df2.to_dict(orient="list")
{'a': [1L, 2L, 3L], 'b': [4L, 5L, 6L]}
# dict指定嵌套字典类型
df2.to_dict(orient="dict")
{'a': {0: 1L, 1: 2L, 2: 3L}, 'b': {0: 4L, 1: 5L, 2: 6L}}
to_records()将DataFrame对象转化成结构数组,若index参数为True(默认),则返回的数据包含行索引数据。
df2.to_records()
rec.array([(0, 1, 4), (1, 2, 5), (2, 3, 6)],
dtype=[(u'index', '2)
A B C
0 NaN 8 4
1 NaN 3 6
2 5.0 3 9
isnull()和notnull()函数判断元素是否为NaN,两者的结果都是bool类型的DataFrame,两者的bool类型相反,但是实质是一样的。但notnull()会少创建一个临时对象,相对效率较高。
df_nan.isnull()
A B C
0 True False False
1 True False False
2 False False False
df_nan.notnull()
A B C
0 False True True
1 False True True
2 True True True
count()返回每列或每行的非NaN的元素个数,默认为列,即axis=0:
df_nan.count()
A 1
B 3
C 3
dtype: int64
df_nan.count(axis=1)
0 2
1 2
2 3
dtype: int64
在实际应用时最干脆的方法是对NaN的行列直接删除,这适合于包含NaN的行列在总数中占的比例很小的时候,通过thresh可以控制对NaN的筛选,只删除大于等于thresh的行。
df_nan.dropna()
A B C
2 5.0 3 9
df_nan.dropna(thresh=1)
A B C
0 NaN 8 4
1 NaN 3 6
2 5.0 3 9
有时候不能直接删除NaN的行列,这时候需要对其填充,ffill()使用之前的数据填充;bfill()使用之后的数据填充;interpolate()使用前后插值填充。interpolate()默认使用等距线性插值,可以通过其method参数指定插值算法。
s = pd.Series([3,np.NaN,7], index=[0,8,9])
s.interpolate()
0 3.0
8 5.0
9 7.0
dtype: float64
s.interpolate(method="index")
0 3.000000
8 6.555556
9 7.000000
dtype: float64
interpolate()默认使用前后两个值得平均值,当method=”index”时,根据index来进行插值,由于8和9比较接近,所以插值后离7比较近。此外,还可以用fillna()函数对不同列进行不同值填充,参数是以字典形式传入。
df_nan.fillna({"A":3.0})
A B C
0 3.0 8 4
1 3.0 3 6
2 5.0 3 9
各种聚合方法的skipna参数默认为True, 因此计兑时将忽略NaN 元素,注意每行或每列是单独运算的。如果需要忽略包含NaN 的整行,需要先调用dropna()。若 将 skipna参数设置为False, 则包含NaN 的行或列的运算结果为NaN。
df_nan.sum()
A 5.0
B 14.0
C 19.0
dtype: float64
df_nan.sum(skipna=False)
A NaN
B 14.0
C 19.0
dtype: float64
df_nan.dropna().sum()
A 5.0
B 3.0
C 9.0
dtype: float64
df.combine_first(other)使用other填充df中的NaN元素。它 将 df中的NaN元素替换为other中对应标签的元素。
DataFrame增添删除DataFrame同时提供了对DataFrame对象得增删该查函数,这些函数包括:
DataFrame可以看作是Series组成的字典,通过DataFrame[colname]=values可以添加新的列,如果需要从已有的列通过计算来得到新的列,则可以通过eval函数。
df = pd.DataFrame(np.random.randint(0,10,(4,4)), columns=list("ABCD"))
A B C D
0 6 9 1 9
1 4 2 6 7
2 8 8 9 2
3 0 6 7 8
df["newcol"] = df.eval("A+10")
A B C D newcol
0 6 9 1 9 16
1 4 2 6 7 14
2 8 8 9 2 18
3 0 6 7 8 10
assign()方法添加关键字指定的新列,其它内容保持不变。
df.assign(newcol2=df.A+1)
A B C D newcol newcol2
0 6 9 1 9 16 7
1 4 2 6 7 14 5
2 8 8 9 2 18 9
3 0 6 7 8 10 1
append()方法用于添加行,它没有inplace参数,只能返冋一个全新对象。由于每次调用append()都会复制所有的数据,因此在循环屮使用append()添加数据会极大地降低程序的运总速度。可以使用一个列表缓存所有的分块数据,然后调用concat()将所有这些数据沿着指定轴拼贴到一起。
def rand_dataframe(n):
columns=["A","B","C"]
for i in range(n):
nrow = np.random.randint(10,20)
yield pd.DataFrame(np.random.randint(0,100,size=(nrow,3)), columns=columns)
df_list = list(rand_dataframe(100))
df_res1 = pd.DataFrame([])
for df in df_list:
df_res1 = df_res1.append(df)
######################################################
df_res2 = pd.concat(df_list,axis=0)
drop()函数能删除指定标签的行和列.
df = pd.DataFrame(np.random.randint(0,100,size=(10,10)), columns=list("ABCDEFGHIJ"))
df.drop(["A","B"], axis=1)
df.drop([0,1], axis=0)
reset_index()可以将索引转换为列,level指定转换的索引级别,如果只希望从索引中删除某个级别,可以设置drop参数为True。
df.reset_index()
set_index()可以将指定列转换为index,append参数为True时,为当前索引添加新的级别,为False时,将删除原先的index。stack()方法把指定级別的列索引转换为行索引,而unstack()则把行索引转换为列索引。无论是stack()还是unstack(),当所有的索引被转换到同一个轴上时,将得到一个Series对象。reorder_levels()和 swaplevel()交换指走轴的索引级别。
分组运算所谓分组运算是指使用特定的条件将数裾分为多个分组,然后对每个分组进行运算,最后再将结果整合起来。Pandas中的分组运算由DataFrame或 Series对象的groupby()方法实现。当分组用的数据在源数据中时,可以直接通过列名指定分纟11数据。当源数据是DataFrame类型时,groupby()方法返回一DataFrameGroupBy对象。源数据为Series类型,则返SeriesGroupBy对象。
Dose Res1 Res2 Tmt Age Gender
0 50 9.90 10.00 C 60 F
1 15 0.02 0.04 D 60 F
2 25 0.63 0.80 C 50 M
df.groupby("Tmt")
还可以使用列表传递多组分组数据给groupby():
df.groupby(["Tmt","Age"])
可以通过len()获取分组数:
print len(tmt)
2
GroupBy对象支持迭代接口,它与字典的iteritems()方法类似,每次迭代得到分组的键和数据。当使用多列数据分组时,与每个组对应的键是一个元组。
for key , df in tmt:
print "key=", key,",shape=",df.shape
key= C ,shape= (2, 6)
key= D ,shape= (1, 6)
get_group()方法可以获得与指定的分组键对应的数据:
tmt.get_group("C")
Dose Res1 Res2 Tmt Age Gender
0 50 9.90 10.0 C 60 F
2 25 0.63 0.8 C 50 M
tmt.get_group("D")
Dose Res1 Res2 Tmt Age Gender
1 15 0.02 0.04 D 60 F
对GroupBy的下标操作将获得一个只包含源数据中指定列的新GroupBy象,GroupBy类中定义了getattr() 方法,因此当获取GroupBy中未定义的属性时,将按照下 面的顺序操作: •如果属性名是源数据对象的某列的名称,则相当于GroupBy[name], 获取针对该列的GroupBy对象。 •如果属性名是源数据对象的方法,则相当于通过apply()对每个分组调用该方法。注意Pandas中定义了转换为apply()的方法集合,只有在此集合之中的方法才会被自动转换。 通过GroupBy对象提供的agg()、transform()、filter()以及apply()等方法可以实现各种分组运算。每个方法的第一个参数都是一个回调函数,该函数对每个分组的数据进行运算并返回结果。这些方法根据回调函数的返回结果生成最终的分组运算结果。
agg()聚合agg()对每个分组中的数据进行聚合运算。所谓聚合运算是指将一组由N个数值组成的数据转换为单个数值的运算,例如求和、平均值、中间值甚至随机取值等都是聚合运算。其回调函数接收的数据是表示每个分组中每列数据的Series对象,若回调函数不能处理Series对象,则agg()会接着尝试将整个分组的数据作为DataFmme对象传递给回调函数。回调函数对其参数进行聚合运算,将 Series对象转换为单个数值,或将 DataFrame对象转换为Series对象。agg()返冋一个DataFmme对象,其行索引为每个分组的键,而列索引为源数据的列索引。
transform()转换transform()对每个分组中的数据进行转换运算。与agg()相同,首先尝试将表示每列的Series对象传递给回调函数,如果失败,将表示整个分组的DataFmme对象传递给回调函数。回调函数的返回结果与参数的形状相同,transform()将这些结果按照源数据的顺序合并在一起。
filter()过滤filter()对每个分组进行条件判断。它将表示每个分组的DataFrame对象传递给回调函数,该函数返True或False, 以决定是否保留该分组。filter()的返回结果是过滤掉一些行之后的DataFmme对象,其行索引与源数据的行索引的顺序一致。
apply()apply()是一个强大的函数,能够实现前面说的几个函数的功能,但由于太灵活,用不好的化可能会出现很大的错误,具体可百度参看详解。
关于CSDN软件工程师能力认证
CSDN软件工程师能力认证(以下简称C系列认证)是由中国软件开发者网CSDN制定并推出的一个能力认证标准。C系列认证历经近一年的实际线下调研、考察、迭代、测试,并梳理出软件工程师开发过程中所需的各项技术技能,结合企业招聘需求和人才应聘痛点,基于公开、透明、公正的原则,甑别人才时确保真实业务场景、全部上机实操、所有过程留痕、存档不可篡改。C系列认证的宗旨是让一流的技术人才凭真才实学进大厂拿高薪,同时为企业节约大量招聘与培养成本,使命是提升高校大学生的技术能力,为行业提供人才储备,为国家数字化战略贡献力量。
了解详情可点击:CSDN软件工程师能力认证介绍
本文出处:https://blog.csdn.net/unixtch/article/details/78821320?ops_request_misc=&request_id=&biz_id=102&utm_term=python科学计算&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-2-78821320.pc_search_result_before_js&spm=1018.2226.3001.4187