pandas - 01

文件读写

- 读文件
1) csv 格式

df = pd.read_csv('path')
df.head()

2)  txt格式

df = pd.read_txt('path')

3) xlsx格式

df = pd.read_excel('path')

- 写文件
1) csv格式

df.to_csv('data/new_table')

2) xlsx格式

df.to_excel('data/new_table')

数据结构

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)。或者直接说是不知class feature的,有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		5		1.3
二		b		6		2.5
三		c		7		3.6
四		d		8		4.6
五		e		9		5.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	-1
2	-1
3	 2
# 索引对其下的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		5		1.3		a		NaN
二		b		6		2.5		b		NaN
三		c		7		3.6		c		NaN
四		d		8		4.6		d		NaN
五		e		9		5.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		5		1.3		a		d
二		b		6		2.5		b		e
三		c		7		3.6		c		f
四		d		8		4.6		d		w
五		e		9		5.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.32.53.64.65.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	173	63	A+
32.5	S_1	C_1	1102	F	street_2	192	73	B+
87.2	S_1	C_1	1103	M	street_2	186	82	B+
80.4	S_1	C_1	1104	F	street_2	167	81	B-
84.8	S_1	C_1	1105	F	street_4	159	64	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	24
1	Anna	Paris	    13
2	Peter	Berlin	    53
3	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']])

问题与练习

  1. 问题
    【问题一】 Series和DataFrame有哪些常见属性和方法?
    【问题二】 value_counts会统计缺失值吗?

    【问题三】 与idxmax和nlargest功能相反的是哪两组函数?
    idxmin/ nsmallest
    【问题四】 在常用函数一节中,由于一些函数的功能比较简单,因此没有列入,现在将它们列在下面,请分别说明它们的用途并尝试使用。
    sum/mean/median/mad/min/max/abs/std/var/quantile/cummax/cumsum/cumprod
    计算和/均值/中位数/ mean absolute deviation平均绝对偏差/最小值/最大值/绝对值/方差/样本分位数/cumulative maximum累计最大值/累计最小值/cumulative produc累计积? 不懂干嘛用的
    【问题五】 df.mean(axis=1)是什么意思?它与df.mean()的结果一样吗?第一问提到的函数也有axis参数吗?怎么使用
    axis=rows, axis=columns
    差不多和经纬线相同的感觉吧,先经,逐行,竖着的;后纬,逐列,横着的。
    算每行的均值,不一样,默认情况是axis=0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值