python.pandas 精简语法

本文介绍了Python的Pandas库,重点讲解了Series和DataFrame数据类型,包括创建、取值、增删改查等基本操作,以及如何进行重新索引、算术运算、缺失值处理和层次化索引等高级功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#通过索引是视图 不是副本

1.导包

import pandas as pd
from pandas import Series,DataFrame
import numpy as np

2.Series(数据类型)

2.1 创建Series

#Series 由索引和一维数组组成

obj = Series([4,7,-5,3]) # 默认索引
obj.values  # 获得值
array([ 4, 7, -5,  3], dtype=int64)
obj.index   # 索引值
RangeIndex(start=0, stop=4, step=1)
#带索引值
obj2  = Series([4,7,-5,3],index=['d','b','a','c'])
#字典
sdata ={'Ohio':35000,'Texas':71000,'Oregon':16000,'Utah':5000}
obj3 = Series(sdata)

2.2 取值

#取值
obj2['a']
obj2['a','b']
#类似字典,索引和值一一对应,无论做什么操作(根据布尔值进行过滤.标量乘法,数学函数等)
#索引和值的对应关系不变,但是索引值可能会重复
#类似字典,判断键是否存在(索引是否存在)
'b' in obj2
#判断是否有NA
pd.isnull(obj4) #是否有Na值
pd.notnull(obj4)  #是否有非NA值

3.DataFrame(数据类型)

3.1 定义

DataFrame 是一个表格型的数据结构,具有行索引和列索引.每列的数据可以不相同,但是公用一个索引(行,列)

3.2 创建

data = {'state':['Ohio','Ohio','Ohio','Nevada','Nevada'],
       'year':[2000,2001,2002,2001,2002],
       'pop':[1.5,1.7,3.6,2.4,2.9]}
frame = DataFrame(data)
frame_test = DataFrame(data,index=['a','b','c','d','e'])#添加索引

3.3 简单的增删改查

#取列  返回的Series和原DataFrame相同的索引
frame['state']
frame.state
#增加一列
frame['debt'] = np.arange(5)
frame['debt'] = 16.5
#改
val = Series([2,3],index=[1,2])
#frame.loc[1:2,'year'] 选取要修改的数据,下面会讲到
frame.loc[1:2,'year'] = val 
#删
del frame['year']

3.4 索引对象(暂时不讲)

4.基本功能

4.1 重新索引

功能:pandas中的reindex方法可以为series和dataframe添加或者删除索引。
方法:serise.reindex()、dataframe.reindex()
如果新添加的索引在原数组的索引中不存在,则默认为nan。如果减少索引,就相当于一个切片操作。

obj = Series([4.5,7.2,-5.3,3.6],index=['d','b','a','c'])
d    4.5
b    7.2
a   -5.3
c    3.6
obj2 = obj.reindex(['a','b','c','d','e'],fill_value=0)#重新索引比原来的数组多,用0补充
#行索引
obj3 = Series(['blue','purple','yellow'],index=[0,2,4])
obj3.reindex(range(6),method='ffill')#插值处理
0      blue
1      blue
2    purple
3    purple
4    yellow
5    yellow
dtype: object
#列索引
frame = DataFrame(np.arange(9).reshape(3,3),index=['a','c','d'],
                 columns=['Ohio','Texas','California'])
frame.reindex(columns=['Texas','Utah','California'])
method参数选项说明
ffill或pad前向填充(或搬运)值
bfill或backfill后向填充(或搬运)值

reindex函数的参数

参数说明
index行索引
column列索引
method插值(填充)方式
fill_value缺失值的替代值
limit前向或后向填充是的最大填充量
copy默认为True.无论如何都复制.如果为False,则新旧相等就不复制
# 删除 列  返回一个新的对象
frame.drop(['Ohio','Texas'],axis=1)

4.2 选取值

data  = DataFrame(np.arange(16).reshape(4,4),
                 index=['Ohio','Colorado','Utah','New York'],
                 columns=['one','two','three','four'])
data

           one 	  two	 three	  four
Ohio	   0	    1	   2	   3
Colorado   4	    5	   6	    7
Utah	   8	    9	   10	    11
New York  12	    13	    14	     15
data  = DataFrame(np.arange(16).reshape(4,4),
                 index=['Ohio','Colorado','Utah','New York'],
                 columns=['one','two','three','four'])

data
onetwothreefour
Ohio0123
Colorado4567
Utah891011
New York12131415
data.loc[['Colorado','Utah'],['two','three']]
twothree
Colorado56
Utah910
data.ix[['Colorado','Utah'],['two','three']]
D:\anaconda\lib\site-packages\ipykernel_launcher.py:1: DeprecationWarning: 
.ix is deprecated. Please use
.loc for label based indexing or
.iloc for positional indexing

See the documentation here:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecated
  """Entry point for launching an IPython kernel.
twothree
Colorado56
Utah910

DataFrame 索引选项

类型说明
obj[val]选取DataFrame的一组列.
obj.ix[val]选取单行或单列
reindex[val,val2]同时选多行或多列
obj.loc[val1,val2]同时选行和列

4.4 算术运算和数据对齐

#填充值
df1 = DataFrame(np.arange(12).reshape(3,4),columns=list('abcd'))
df1
abcd
00123
14567
2891011
df2 = DataFrame(np.arange(20).reshape(4,5),columns=list('abcde'))
df2 
abcde
001234
156789
21011121314
31516171819
df1 + df2 #返回时原来两个DataFrame的并集,没有重叠的地方,会出现Na
abcde
00.02.04.06.0NaN
19.011.013.015.0NaN
218.020.022.024.0NaN
3NaN
df1.add(df2,fill_value=0)
abcde
00.02.04.06.04.0
19.011.013.015.09.0
218.020.022.024.014.0
315.016.017.018.019.0
# add  #加
# sub  #减
# div  #除
# mul  #乘

4.5 DataFrame和Series之间的运算

frame = DataFrame(np.arange(12).reshape(4,3),columns=list('bde'),
                 index=['Utah','Ohio','Texas','Oregon'])
frame
bde
Utah012
Ohio345
Texas678
Oregon91011
frame.loc['Utah']
b    0
d    1
e    2
Name: Utah, dtype: int32
frame.sub(frame.loc['Utah'],axis=1)  #传入的轴是希望匹配的轴
bde
Utah0
Ohio3
Texas6
Oregon9
# 函数应用和映射
frame.apply(lambda x:x.max()-x.min())
b    9
d    9
e    9
dtype: int64
frame.apply(lambda x:x.max()-x.min(),axis=1)
Utah      2
Ohio      2
Texas     2
Oregon    2
dtype: int64
#元素级的python(对应每个值)
frame.applymap(lambda x:'%.2f' %x)
bde
Utah0.001.002.00
Ohio3.004.005.00
Texas6.007.008.00
Oregon9.0010.0011.00
frame.sort_values(by='b',ascending=False) #轴代表方向
bde
Oregon91011
Texas678
Ohio345
Utah012
frame.sort_values(by='Utah',axis=1,ascending=False)
edb
Utah210
Ohio543
Texas876
Oregon11109
# rank 排名  按值的大小进行排序
frame=pd.DataFrame({'b':[5,7,-3,2],'a':[0,1,0,1],'c':[-2,5,8,-3]})
frame
bac
050-2
1715
2-308
321-3
frame.rank(axis=0)
bac
03.01.52.0
14.03.53.0
21.01.54.0
32.03.51.0
frame.rank(axis=1)
bac
03.02.01.0
13.01.02.0
21.02.03.0
33.02.01.0

排名是用于破坏平级关系的method选项(如果两个数相等,表明在相同的分组)

method说明
average默认:在同组中,为各个值分配平均排名
min使用整个分组的最小排名
max使用整个分组的最大排名
first按值出现的先后顺序

4.6 带着重复值的轴索引

df = DataFrame(np.random.randn(4,3),index=['a','a','b','b'])
df
012
a-0.3280411.907503-0.896179
a-0.049003-0.5978080.744535
b-1.142489-0.846847-0.140037
b-1.154353-0.947474-1.460308
#判断索引是否唯一
df.index.is_unique
False
#索引名,可能会取多个
df.loc['a']
012
a-0.3280411.907503-0.896179
a-0.049003-0.5978080.744535
#索引的行号,只会去单个
df.iloc[1]
0   -0.049003
1   -0.597808
2    0.744535
Name: a, dtype: float64

4.7汇总和计算描述统计

df = DataFrame([[1.4,np.nan],[7.1,-4.5],[np.nan,np.nan],[0.75,-1.3]],index=['a','b','c','d'],columns=['one','two'])
df
onetwo
a1.40NaN
b7.10-4.5
cNaN
d0.75-1.3
#NA 会自动排除(默认为0)
df.sum()
one    9.25
two   -5.80
dtype: float64
df.sum(skipna=False)
one   NaN
two   NaN
dtype: float64
参数说明
axis
skipna是否忽略缺失值,默认为True

描述和汇总统计

函数说明
count非NA值得数量
describe列的计算汇总统计
min,max最大值,最小值
argmin,argmax计算能获取到最大值和最小值的索引位置(整数)
idxmin,idxmax计算能获取到最大值和最小值的索引位置
quantile计算样本的分位数(0到1)
sum
mean平均数
median值得算术中位数
mad根据平均值计算平均绝对离差
var方差
std标注差
skew偏度(三阶矩)
kurt峰度(四阶矩)
cumsum累计和
cummin,cummax累计最大值和累计最小值
cumprod累计积
diff计算一阶差分(对时间序列有用)
pct_change计算百分数变化
obj = Series(['c','a','d','a','b','b','c','c'])
obj
0    c
1    a
2    d
3    a
4    b
5    b
6    c
7    c
dtype: object
#唯一值
obj.unique()
array(['c', 'a', 'd', 'b'], dtype=object)
#频率
obj.value_counts()
c    3
a    2
b    2
d    1
dtype: int64
#是否属于
obj.isin(['b','c'])
0     True
1    False
2    False
3    False
4     True
5     True
6     True
7     True
dtype: bool

5.缺失值处理

NA的处理方法

方法说明
dropna根据各标签的值中是否存在缺失数据对轴标签进行过滤,可通过阈值调节对缺失值得容忍度
fillna用指定值或插值方法(ffill或bfill)填充缺失数据
isnull返回一个含有布尔值的对象,这些布尔值表示哪些值是缺失值NA
notnullisull的否定式

5.1 滤除缺失数据

from numpy import nan as NA
data = DataFrame([[1,6.5,3],[1,NA,NA],[NA,NA,NA],[NA,6.5,3]])
data
012
01.06.53.0
11.0NaN
2NaN
3NaN6.53.0
#默认丢弃任何含有缺失值得行
data.dropna()
012
01.06.53.0
#只丢弃全部为NA的行
data.dropna(how='all')
012
01.06.53.0
11.0NaN
3NaN6.53.0

5.2 填充数据

df = DataFrame(np.random.randn(7,3))
df.iloc[:5,1] =NA;df.iloc[:3,2]=NA
df
012
01.734150NaN
10.706558NaN
2-0.393785NaN
31.317984NaN-2.853658
40.415997NaN-0.125980
5-0.1545390.5573471.042196
60.385543-0.960659-0.946296
#填充
df.fillna(0)
012
00.1686080.000000
10.0129190.000000
21.2212310.000000
3-1.5153740.0000000.774739
40.0813860.000000-0.327303
5-0.1938861.5709731.057608
60.1315760.6233440.392884
#传入字典  
df.fillna({1:0.5,2:-1})
012
00.2109550.500000-1.000000
10.6663890.500000-1.000000
20.4884860.500000-1.000000
32.1665150.5000000.736014
4-0.7025730.500000-1.150182
50.3105450.024061-0.506138
60.7291560.3683451.721337
#传入字典,默认会返回新对象
_ = df.fillna({1:0.5,2:-1},inplace=True) #对原数据进行修改,不返回新对象
df
012
01.7341500.500000-1.000000
10.7065580.500000-1.000000
2-0.3937850.500000-1.000000
31.3179840.500000-2.853658
40.4159970.500000-0.125980
5-0.1545390.5573471.042196
60.385543-0.960659-0.946296

6.层次化索引

#它使你能在一个轴上拥有多个(两个以上)索引级别.使你能以低维度形式处理高维度数据
data = Series(np.random.randn(10),index=[['a','a','a','b','b','b','c','c','d','d'],[1,2,3,1,2,3,1,2,2,3]])
data
a  1   -1.076458
   2    1.126883
   3    0.628407
b  1    1.704866
   2    2.212012
   3   -2.006192
c  1    0.153430
   2   -1.172675
d  2   -2.626143
   3   -2.760771
dtype: float64
data['b']
1    1.704866
2    2.212012
3   -2.006192
dtype: float64
#内层
data['b',2]  #data[:,2] 所有2的行
2.212012376812743
data.unstack()
123
a-1.0764581.1268830.628407
b1.7048662.212012-2.006192
c0.153430-1.172675NaN
dNaN-2.626143-2.760771
frame = DataFrame(np.arange(12).reshape(4,3),
                 index=[['a','a','b','b'],[1,2,1,2]],
                 columns=[['Ohio','Ohio','Colorado'],['Green','Red','Green']])
frame
OhioColorado
GreenRedGreen
a1012
2345
b1678
291011
frame = DataFrame({'a':range(7),'b':range(7,0,-1),
                  'c':['one','one','one','two','two','two','two'],
                  'd':[0,1,2,0,1,2,3]})
frame
abcd
007one0
116one1
225one2
334two0
443two1
552two2
661two3
#默认 列会从原数据中移除
frame2 = frame.set_index(['c','d'])
frame2
ab
cd
one007
116
225
two034
143
252
361
frame2 = frame.set_index(['c','d'],drop=False)
frame2
abcd
cd
one007one0
116one1
225one2
two034two0
143two1
252two2
361two3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值