1) Series
创建Series
s = pd.Series(np.random.randn(5), index=['a','b','c','d','e'], name='This is a Series'), dtype='float64')# np.random.randn(n) 从标准正态中返回n个样本# Series常用属性:values, index, name>>>
a 0.115923
b 0.214834
c 0.374000
d 0.307187
e 0.109482
Name: This ia a Series, dtype: float64
- 访问属性
s.name
s.values
s.index
s.dtype
- 访问某个元素
s['a']- 调用方法
s.mean()2) DataFrame
长得有点像与其说是2-d array,不如说像relation,有attribute(cols) 和examples(rows)。或者直接说是不知classfeature的,有features的不同instance。
- 创建一个DataFrame
df = pd.DataFrame({'col1':list('abcde'),'col2':range(5,10),'col3':[1.3,2.5,3.6,4.6,5.8]},index=list('一二三四五'))# 按列输入,字典 - head:list/range, 加每行的index- 从DataFrame中取出一列为Series
df['col1']>>>
一 a
二 b
三 c
四 d
五 e
Name: col1, dtype:object#values:('abcde'),index,name='col1'- 修改行或列名
df.rename(index={'一':'one'},columns={'col1':'new_col1'})
new_col1 col2 col3
one a 51.3
二 b 62.5
三 c 73.6
四 d 84.6
五 e 95.8- 调用属性或方法
df.index
df.column.
df.values # return array
df.shape
df.reshape()
df.mean()- 索引对其特性
df1 = pd.DataFrame({'A':[1,2,3]},index=[1,2,3])
df2 = pd.DataFrame({'A':[1,2,3]},index=[3,1,2])>>>
A
1-12-132# 索引对其下的df加减法吗哈哈- 删除列
# drop/ del pop都能实现
df.drop(index='五',columns='col1')# 好处是可以选择row和col,不好的是index和columns得写清楚噢def df['col1']
df
# only columns
df.pop('col1')# df.pop()=del df[] + return deleted column- 增加新的列
df['col4']=list('abc')#assign 临时赋值,不对原df产生改变
df.assign(C=pd.Series('def'))
col1 col2 col3 col4 C
一 a 51.3 a NaN
二 b 62.5 b NaN
三 c 73.6 c NaN
四 d 84.6 d NaN
五 e 95.8 e NaN
#没有赋值成功是因为pd.assign默认index是range(n),而这里索引是一二三四五#尝试过失败的方法:
df.set_index([pd.Index([1,2,3,4,5])])# 原因是:set_index对原有的df没有影响# 这个就完全没有问题
df.assign(C=pd.Series(list('defwq'),index=['一','二','三','四','五']))>>>
col1 col2 col3 col4 C
一 a 51.3 a d
二 b 62.5 b e
三 c 73.6 c f
四 d 84.6 d w
五 e 95.8 e q
# 但这还是有个问题,新加cols values个数必须和index个数一致,如果只写一个,其余都是NaN
Series(list('d'),index=['一'])# assign 和 set_index都只能临时修改,对df本身不产生影响- 根据类型选择列
-
df.select_dtype(inclde=['number']).head()# df.head()返回dataframe的前五行>>>
col3
一 1.3
二 2.5
三 3.6
四 4.6
五 5.8- 将Series转换为DataFrame
# s为df每列均值的纵向series
s = df.mean()
s.to_frame()# s的dataframe形式,同样对原s不产生影响
s.to_frame.T # df.T dataframe的转置
常用函数
# 查看df前后n rows,不写n默认n=5
df.head(n)
df.tail(n)# unique/ nunique# 这俩函数只能用于单一column,>1都不得行
df['Physics'].nunique()# 有几个唯一值
df['Physics'].unique()# 显示所有唯一值# count/ value_counts
df['Physics'].count()# 返回非缺失值元素个数, NaN算空值,但是用特殊符号替代的空值应该就不算了# 如用'?'代替空缺值,则应# df.replace('?',np.nan)
df['Physics'].value_counts()#返回每个元素有多少个#describe和info# info 查看非空值和每个feature series的dtype# describe 对各个feature进行简单统计学计算
df.describe(percentiles=[.05,.25,.75,.95])#可自行选择分位数,这里没太懂为啥要?# describe 也可以用于Series,即df的一列
df['Physics'].describe()>>>
count 35
unique 7
top B+
freq 9
Name: Physics, dtype:object# idxmax和nlargest
df['Math'].idxmax()# return max value
df['Math'].nlargest(3)# 返回前几个最大值
df['Math'].nsmallest(3)# clip/ replace
df['Math'].clip(33,80).head()# drop the value out of (33,80)
df['Address'].replace(['street_1','street_2'],['one','two']).head()#如果有多个值,用方括号括起来# 通过字典改
df.replace({'Address':{'street_1':'one','street_2':'two'}})# 我记得替换df里某个值,用map也可以,但是具体用法忘记了,再补# apply 自由度很高的函数# 在Series中进行迭代
df['Math'].apply(lambda x:str(x)+'!').head()#可以使用lambda表达式,也可以使用函数
df.apply(lambda x:x.apply(lambda x:str(x)+'!')).head()#这是一个稍显复杂的例子,有利于理解apply的功能>>>> School Class ID Gender Address Height Weight Math Physics
0 S_1! C_1! 1101! M! street_1! 173! 63! 34.0! A+!
1 S_1! C_1! 1102! F! street_2! 192! 73! 32.5! B+!
2 S_1! C_1! 1103! M! street_2! 186! 82! 87.2! B+!
3 S_1! C_1! 1104! F! street_2! 167! 81! 80.4! B-!
4 S_1! C_1! 1105! F! street_4! 159! 64! 84.8! B+!
排序
- 索引排序 把某一列为索引
df.set_index('Math')>>>
School Class ID Gender Address Height Weight Physics
Math
34.0 S_1 C_1 1101 M street_1 17363 A+32.5 S_1 C_1 1102 F street_2 19273 B+87.2 S_1 C_1 1103 M street_2 18682 B+80.4 S_1 C_1 1104 F street_2 16781 B-84.8 S_1 C_1 1105 F street_4 15964 B+
df.set_index('Math').sort_index()# 把一列设为index并sorting- 值排序
df.sort_values(by='Class').head()
df.sort_values(by=['Address','Height']).head()#先对第一层排,在第一层相同的情况下对第二层排序
其他
import pandas as pd
# transform dictionary to dataframe
data ={'Name':["John","Anna","Peter","Linda"],'Location':["New York","Paris","Berlin","London"],'Age':[24,13,53,33]}
data_pandas = pd.DataFrame(data)
display(data_pandas)
Name Location Age
0 John New York 241 Anna Paris 132 Peter Berlin 533 Linda London 33#任取attributes
display(data_pandas[['Name','Location']])# 任取rows 要根据索引,使用pandas.iloc function# iloc -- integer location function
display(data_pandas.iloc[[1,3]])# 不能返回切片[1:3]# 不根据角标索引而是我们自己设置一个索引index。 如Name# 悄咪咪说一句,这个Name应该就是这个relation的primary key了# 重新设置dataframe
data_pandas = data_pandas.set_index('Name')# 根据新设置的index索引# 设置前,根据角标integer索引所以是iloc,更改之后变成loc# 可以同时查询多个instance
display(data_pandas.loc[['Anna']])