1、读取数据
data=DataFrame(np.arange(16).reshape(4,4),index=['BJ','SH','GZ','SZ'],columns=['one','two','three','four'])
data
out:
one two three four
BJ 0 1 2 3
SH 4 5 6 7
GZ 8 9 10 11
SZ 12 13 14 15
*****************************************************************************
# 删除行
val=data.drop(['SH','GZ'])
out:
one two three four
BJ 0 1 2 3
SZ 12 13 14 15
*****************************************************************************
删除列
val2=data.drop('two',axis=1)
out:
one three four
BJ 0 2 3
SH 4 6 7
GZ 8 10 11
SZ 12 14 15
DataFrame的索引选项
类型 | 说明 |
---|---|
obj[val] | 选取DataFrame的单列或一组列。在特殊情况下会比较好用:布尔型数组(过滤行),切片(行切片),布尔型DataFrame(根据条件设置值) |
obj.ix[val] | 选取DataFrame的单行或一组行 |
obj.ix[:,val] | 选取DataFrame的单列或列子集 |
obj.ix[val,val] | 同时选取行和列 |
reindex | 将一个或多个轴匹配到新索引 |
xs方法 | 根据标签选取单行或单列值,返回一个Series |
icol,irow | 根据整数位置选取单行或单列值,返回一个Series |
get_value,set_value | 根据行标签,列标签选取单个值 |
直接选取所需的字段名
imdb[['订单编号','客户名称']].head(5)
out:
订单编号 客户名称
0 SO45302 安徽30091自行车销售有限公司
1 SO45308 安徽29861自行车销售有限公司
2 SO45326 安徽29906自行车销售有限公司
3 SO45342 安徽29521自行车销售有限公司
4 SO45343 安徽29511自行车销售有限公司
切片选取
imdb.iloc[10:15,:2]
订单编号 经销商ID
10 SO45487 J004
11 SO45533 J004
12 SO45560 J004
13 SO45581 J004
14 SO45609 J004
# 字段名也可做切片
imdb.loc[3:8,:'客户ID']
out:
订单编号 经销商ID 经销商名称 客户ID
3 SO45342 J004 J004商贸有限公司 29521
4 SO45343 J004 J004商贸有限公司 29511
5 SO45398 J004 J004商贸有限公司 15059
6 SO45433 J004 J004商贸有限公司 12547
7 SO45453 J004 J004商贸有限公司 12549
8 SO45458 J004 J004商贸有限公司 19599
get_value,set_value
df5
one two three
a 0 1 2
b 4 5 6
c 8 9 10
d 12 13 14
# 得到一个值
df5.get_value('a','two')
1
# 修改一个值
df5.set_value('a','two',100)
one two three
a 0 100 2
b 4 5 6
c 8 9 10
d 12 13 14
Series reindex
s1
out:
A 1
B 2
C 3
D 4
dtype: int64
# 修改索引并增加一行数据
s1.reindex(index=['a','b','C','D','E'],fill_value=10)
out:
a 10
b 10
C 3
D 4
E 10
dtype: int64
s2.reindex(index=range(15),method='ffill') # 向下填充
多级index
s1=Series(np.random.randn(6),index=[['1','1','1','2','2','2'],['a','b','c','a','b','c']])v
out:
1 a 0.361075
b -1.270580
c 1.028564
2 a 0.225356
b 2.178631
c -0.130409
dtype: float64
# 转成DataFrame(两种方法)
df2=DataFrame([s1['1'],s1['2']])
df1=s1.unstack()
out:
a b c
1 0.449214 0.136088 0.372118
2 -2.262097 -0.412335 -1.386246
# 还原回去
s3=df1.T.unstack()
Mapping 和 Replace(数据增加)
map通过一个字典或者一个函数进行替换,replace也可以通过一个字典,列表进行替换。
df1=DataFrame({"城市":['北京','上海','广州'],"人口":[1000,2000,1500]})
out:
人口 城市
0 1000 北京
1 2000 上海
2 1500 广州
**************************************************************************
gdp_map={"北京":100,"上海":150,"广州":79}
df1['GDP2']=df1["城市"].map(gdp_map)
df1
人口 城市 GDP2
0 1000 北京 100
1 2000 上海 150
2 1500 广州 79
s1=Series(np.arange(5))
out:
0 0
1 1
2 2
3 3
4 4
dtype: int32
***********************************************
s3=s1.replace([1,3,2],[10,20,30])
out:
0 0
1 10
2 30
3 20
4 4
dtype: int64
2、计算
2.1、直接相加
“+”,直接对应位置相加,没有共同索引的+NaN,在这里数字加 NaN 结果为 NaN。
df1+df2=df3
两张表只有“BJ”跟“SH”两行是共同的,所以这两行数据对应相加,其余的分加NaN。
2.2、设置填充值
df1=DataFrame(np.arange(9.).reshape(3,3),columns=list('abc'))
out:
a b c
0 0.0 1.0 2.0
1 3.0 4.0 5.0
2 6.0 7.0 8.0
df2=DataFrame(np.arange(12.).reshape(3,4),columns=list('abcd'))
out:
a b c d
0 0.0 1.0 2.0 3.0
1 4.0 5.0 6.0 7.0
2 8.0 9.0 10.0 11.0
********************************************************************
# 相加,没有的加上fill_value=0
df1.add(df2,fill_value=0)
out:
a b c d
0 0.0 2.0 4.0 3.0
1 7.0 9.0 11.0 7.0
2 14.0 16.0 18.0 11.0
# 共有的相加,没有的0填充
df1.add(df2).fillna(0)
out:
a b c d
0 0.0 2.0 4.0 0.0
1 7.0 9.0 11.0 0.0
2 14.0 16.0 18.0 0.0
3、函数应用与映射
3.1、绝对值
每个值都变成绝对值
np.abs(df4)
3.2、apply
apply针对一行或一列做数据处理;applymap针对没一个值处理
df4=
b c d
BJ 1.198335 1.680554 1.029306
SH 0.129341 -0.998620 1.441557
XM -0.793182 0.721772 1.740997
SZ 0.255296 -0.023105 0.210413
**********************************************************************
f=lambda x: x.max()-x.min()
df4.apply(f,axis=1)
BJ 0.651249
SH 2.440177
XM 2.534179
SZ 0.278401
dtype: float64
***********************************************************************
# 保留两位小数
f=lambda x: '%.2f' % x
df4.applymap(f)
b c d
BJ 1.20 1.68 1.03
SH 0.13 -1.00 1.44
XM -0.79 0.72 1.74
SZ 0.26 -0.02 0.21
3.3、排序排名
sort_index:对索引值或字段名排列
axis=1:字段名进行排序
ascending=false:降序
df5=
d a b c
two 0 1 2 3
one 4 5 6 7
***********************************************************
df5.sort_index(axis=1,ascending=False)
out:
d c b a
two 0 3 2 1
one 4 7 6 5
sort_values:对值进行排列
axis=1:对行值进行排列(针对每一行处理)
ascending=false:降序
对于一张表要指定一行/列或按顺序几行列
df6=
A B C
0 -0.361234 0.069717 -0.366472
1 -0.423020 0.110963 -0.325918
2 -0.195735 -0.498265 -0.752907
**********************************************************************
df6.sort_values('A',ascending=False)
A B C
2 -0.195735 -0.498265 -0.752907
0 -0.361234 0.069717 -0.366472
1 -0.423020 0.110963 -0.325918
# 多列排序,先排A列,再排B列
df6.sort_values(by=['A','B'])
rank:排名
# 根据B列进行排名
df6['rank']=df6['B'].rank(ascending=False)
df6
A B C D E rank
0 a -0.384627 0.082839 -0.667783 -0.644589 7.0
1 b -0.272969 0.792157 0.456591 -1.285203 6.0
2 c -0.503568 -0.335906 0.560092 -0.797560 8.0
3 d 1.004119 1.338095 0.240176 -1.031286 1.0
4 a 0.326208 -0.859344 -0.118520 0.549362 3.0
5 b 0.317478 0.393170 -0.806814 -0.091022 4.0
6 c 0.237057 0.581169 -0.194672 0.632306 5.0
7 a 0.939396 -1.946748 0.862878 -1.253296 2.0
3.4、汇总统计
NA值会自动被排除,除非整个切片(这里指的是行或列)都是NA。通过 skipna选项可以禁用该功能
df7.sum(axis=1,skipna=False)
df7.sum(axis=1)
df7.mean()
df7.mean()
df7.mean(skipna=False)
累加和
one two
a 2 0
b 7 -5
c 1 1
d 1 -2
***********************************************
df8.cumsum()
out:
one two
a 2 0
b 9 -5
c 10 -4
d 11 -6
isin
判断是否存在,返回True、False
0 a
1 a
2 b
3 a
4 a
5 b
dtype: object
*******************************************************
obj.isin(['b','c'])
0 False
1 False
2 True
3 False
4 False
5 True
dtype: bool
*******************************************************
# 找出含有b,c的值
obj[obj.isin(['b','c'])]
2 b
5 b
dtype: object
# 重复值判断
is_unique
返回True、False
obj.index.is_unique
# 查找唯一值,返回的是值(去重后的值)
unique=obj.unique()
sorted(unique)
返回的值是无序的,如果需要排序,可以用uniques.sort()
# 值的计数
obj.value_counts()
pd.value_counts(obj.values,sort=False)
********************************************************************
Qu1 Qu2 Qu3
0 1 2 1
1 3 3 2
2 4 1 3
3 3 2 5
4 4 3 6
# 转换成计数列表,统计表中每个数,在每一季度出现的次数
result=data.apply(pd.value_counts).fillna(0)
Qu1 Qu2 Qu3
1 1.0 1.0 1.0
2 0.0 2.0 1.0
3 2.0 2.0 1.0
4 2.0 0.0 0.0
5 0.0 0.0 1.0
6 0.0 0.0 1.0
3.5、简单缺失值处理
方法 | 说明 |
---|---|
dropna | 直接删除 |
fillna | 用指定值或插值法(ffill或bfill)填充缺失值 |
isnull | 返回一个含有布尔值的对象 |
notnull | 与isnull相反 |
data.dropna(how='all') # 只有全部为nan时才删除
# 两种等同,返回的是df1
# df1=df1.fillna({'b':0,'d':df1['c'].mean()})
# _=df1.fillna({'b':0,'d':df1['c'].mean()},inplace=True)
4、字符串
5、时间序列
定义一个日期,使用datetime库
打印当前时间
from datetime import datetime
now=datetime.now()
out:
datetime.datetime(2019, 7, 24, 14, 26, 34, 777395)
*****************************************************************
now.year,now.month,now.day
out:
(2019, 7, 24)
两个时间相减,得到天数,秒数
delta=datetime(2011,1,7)-datetime(2008,6,24,10,20)
delta
out:
datetime.timedelta(days=926, seconds=49200)
******************************************************************
delta.days,delta.seconds
out:
(926, 49200)
日期减去天数,得到对应的日期
from datetime import timedelta
start=datetime(2011,1,7)
start+timedelta(12)
out:
datetime.datetime(2011, 1, 19, 0, 0)
*****************************************************
start-2*timedelta(12)
out:
datetime.datetime(2010, 12, 14, 0, 0)
修改日期格式
stamp=datetime(2018,7,12)
# 变成字符串
str(stamp)
'2018-07-12 00:00:00'
# 修改格式
stamp.strftime('%Y-%d-%m')
'2018-12-07'
from dateutil.parser import parse
value='2018-03-12'
parse(value)
out:
datetime.datetime(2018, 3, 12, 0, 0)
******************************************************************
parse('Jan 31,1997 10:15 PM')
out:
datetime.datetime(2018, 1, 31, 22, 15)
pandas 中的时间序列
value='2018-03-12'
pd.to_datetime(value)
out:
Timestamp('2018-03-12 00:00:00')
date_list=[
datetime(2016,9,1),
datetime(2016,9,10),
datetime(2017,9,1),
datetime(2017,9,20),
datetime(2017,10,1)
]
s1=Series(np.random.randn(5),index=[date_list])
s1
out:
2016-09-01 -0.330027
2016-09-10 1.368937
2017-09-01 -0.442337
2017-09-20 -0.779019
2017-10-01 -0.931024
dtype: float64
**********************************************************
s1['2017']
out:
2017-09-01 -0.442337
2017-09-20 -0.779019
2017-10-01 -0.931024
dtype: float64
**********************************************************
s1['2016-09']
out:
2016-09-01 -0.330027
2016-09-10 1.368937
dtype: float64
创建时间序列
# 根据起始时间创建时间序列
index=pd.date_range('4/1/2012','6/6/2012')
index
# 根据时间间隔创建时间序列
index=pd.date_range(start='4/1/2012',periods=20)
index