[复习]Pandas基础(三)

import pandas as pd
import numpy as np

  • NaN空白值的处理

删除指定空白:DataFrame.dropna(self, axis=0, how=‘any’, thresh=None, subset=None, inplace=False)

参数说明:

axis:0或’index’表示按行删除,1或’columns’表示按列删除,默认为按行删除

how:how=‘any’-行或列中只要有一个空白值,该行或该列便会被删除;
how=‘all’-只有当一行或一列中全是空白值时才删除该行或列

thresh:行或列中至少应该包含非空值的个数

subset:指定查找空白值的范围,默认为None,则在整个DataFrame中查找

inplace:是否在原数据上修改,默认为False,生成副本


df = pd.read_csv('test2.csv')
	9	8	8.1
0	8.0	9.0	8.0
1	8.0	8.0	9.0
2	NaN	NaN	NaN
3	6.0	9.0	NaN
4	8.0	NaN	NaN
5	NaN	NaN	4.0
6	5.0	5.0	5.0
7	NaN	7.0	NaN
8	NaN	7.0	7.0

df.dropna(axis=0,how='any')
	9	8	8.1
0	8.0	9.0	8.0
1	8.0	8.0	9.0
6	5.0	5.0	5.0

  • 填充空白值

DataFrame.fillna(self, value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)

参数说明:

value:用来填充空白的值

method:{‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}
backfill/bfill-向后填充
pad/ffill-向前填充

axis:0或’index’表示按行填充,1或’columns’表示按列填充

inplace:是否在原数据上修改,默认为False,生成副本

limit:当method参数设置时,表示最多连续填充多少个。当method没有设置时,表示最多填充多少个空白

downcast:类型转换


df.fillna(8)
	9	8	8.1
0	8.0	9.0	8.0
1	8.0	8.0	9.0
2	8.0	8.0	8.0
3	6.0	9.0	8.0
4	8.0	8.0	8.0
5	8.0	8.0	4.0
6	5.0	5.0	5.0
7	8.0	7.0	8.0
8	8.0	7.0	7.0

# 手动填充 用平均值或中位数填充
values = {'8.1':1,'8':2}
df.fillna(value=values)
9	8	8.1
0	8.0	9.0	8.0
1	8.0	8.0	9.0
2	NaN	2.0	1.0
3	6.0	9.0	1.0
4	8.0	2.0	1.0
5	NaN	2.0	4.0
6	5.0	5.0	5.0
7	NaN	7.0	1.0
8	NaN	7.0	7.0

  • 重复值的处理

    DataFrame.drop_duplicates(self, subset=None, keep=‘first’, inplace=False)

参数说明:

subset:指定检查重复数据的范围

keep:
‘first’-删除重复数据,保留第一个值
‘last’-删除重复数据,保留最后一个值
False-删除所有重复数据,不留任何一个

inplace:是否在原数据上直接修改


  • 统计与计算

    最大最小值: max() min()
    最大索引值:idxmax()
    对数值类型求平均值:mean()
    统计出现的次数:value_counts()
    使用这些方法要注意数据的类型


  • 分组统计

    groupby()

# 根据店名分组,然后找价格最大值
df.groupby('店名')['价格'].max()
店名
24Shopping海外旗舰店         345
3 CONCEPT EYES官方旗舰店      98
A RED HOUSE海外专营店        129
AGE20'S爱敬京东国际海外专营店      178
AQUA海外专营店               159
                       ... 
麦吉丽扬轩专卖店                 60
麦吉丽自营官方旗舰店              218
黛可欣化妆品专营店                28
黛迷雅(Daimiya)京东自营旗舰店    49.8
黛颜彩妆专营店                 298
Name: 价格, Length: 692, dtype: object

  • 排序
# ascending默认升序排序
dd.sort_index(axis=1,ascending=False)

# 指定列排序 
# na_position用来指定把缺失值放在最前面(na_position='first')还是最后面(na_position='last')
dd.sort_values(by='价格',na_position='last')

# 先按照价格升序排列,再按照评论数升序排列
dd.sort_values(['价格','评论数'])

  • 合并DataFrame

    水平拼接:concat()
    垂直添加合并:append()

df1=pd.DataFrame(np.random.randint(0,12,(3,4)))
df2=pd.DataFrame(np.random.randint(100,112,(3,4)))

# 水平拼接  ignore_index=True 重新生成索引
df12=pd.concat([df1,df2],axis=1,ignore_index=True)
# 垂直的添加合并
df1.append(df2,ignore_index=True)

DataFrame.merge方法

DataFrame.merge(self,right,how =‘inner’,on = None,

left_on = None,right_on = None,left_index = False,

right_index = False,sort = False,后缀=(’_ x’,’ _y '),

copy = True,indicator = False,validate = None )

# 两张表格拥有相同的信息,将两个表格拼接再一起 求交集/并集
df3=pd.DataFrame({'key':['foo','bar','baz','foo'],'value':[1,2,3,4]})
df4=pd.DataFrame({'key':['foo','bar','baz','foo'],'value':[1,2,3,4]})

# 交集 inner(数据库中的内部连接)  suffixes指定行索引的名称
print(df3.merge(df4,on='key',how='inner',suffixes=('A','B')))

# 并集 outer外部连接
print(df3.merge(df4,on='key',how='outer'))
   key  valueA  valueB
0  foo       1       1
1  foo       1       4
2  foo       4       1
3  foo       4       4
4  bar       2       2
5  baz       3       3
key	value_x	value_y
0	foo	1		1
1	foo	1		4
2	foo	4		1
3	foo	4		4
4	bar	2		2
5	baz	3		3

  • 应用函数

apply(func_name) 将一个函数作用域DataFrame中的行或者列

map(func_name) 是一个Series的函数,应用到Series结构中的每个元素


  • pandas中处理时间序列

pandas.date_range(start=None, end=None, periods=None, freq=None, tz=None, normalize=False, name=None, closed=None, **kwargs)

参数说明:
·start:起始时间
·end:结束时间
·periods:生成时间序列的数量
·freq:频率,默认为‘D’,即按天
·tz:时区
·normalize:把时间标准化到午夜
·name:生成的日期范围的名字
·closed:{None, ‘left’, ‘right’},是否包含起始或结束时间。closed=left,不包含结束时间,closed=right,不包含起始时间。默认为None,起始和结束都包含。
start,end,periods,freq这4个参数只能设置3个。


index1=pd.date_range(start='2019-11-1',end='2019-11-10')
DatetimeIndex(['2019-11-01', '2019-11-02', '2019-11-03', '2019-11-04',
               '2019-11-05', '2019-11-06', '2019-11-07', '2019-11-08',
               '2019-11-09', '2019-11-10'],
              dtype='datetime64[ns]', freq='D')

index2=pd.date_range(start='2020-4-8',end='2020-4-29',periods=5)
DatetimeIndex(['2020-04-08 00:00:00', '2020-04-13 06:00:00',
               '2020-04-18 12:00:00', '2020-04-23 18:00:00',
               '2020-04-29 00:00:00'],
              dtype='datetime64[ns]', freq=None)

index3=pd.date_range(start='2019-11-1',end='2019-11-2',freq='1h',tz='Asia/Shanghai')
DatetimeIndex(['2019-11-01 00:00:00+08:00', '2019-11-01 01:00:00+08:00',
               '2019-11-01 02:00:00+08:00', '2019-11-01 03:00:00+08:00',
               '2019-11-01 04:00:00+08:00', '2019-11-01 05:00:00+08:00',
               '2019-11-01 06:00:00+08:00', '2019-11-01 07:00:00+08:00',
               '2019-11-01 08:00:00+08:00', '2019-11-01 09:00:00+08:00',
               '2019-11-01 10:00:00+08:00', '2019-11-01 11:00:00+08:00',
               '2019-11-01 12:00:00+08:00', '2019-11-01 13:00:00+08:00',
               '2019-11-01 14:00:00+08:00', '2019-11-01 15:00:00+08:00',
               '2019-11-01 16:00:00+08:00', '2019-11-01 17:00:00+08:00',
               '2019-11-01 18:00:00+08:00', '2019-11-01 19:00:00+08:00',
               '2019-11-01 20:00:00+08:00', '2019-11-01 21:00:00+08:00',
               '2019-11-01 22:00:00+08:00', '2019-11-01 23:00:00+08:00',
               '2019-11-02 00:00:00+08:00'],
              dtype='datetime64[ns, Asia/Shanghai]', freq='H')

# 创建并访问以时间序列为索引的Series和DataFrame
s1 = pd.Series(np.random.randn(5),index=pd.date_range(start='2020-1-1',periods=5))
s1['2020-1-1']

# 对于一个长的时间序列,可以传递一个年份或一个年份和月份来轻松地选择数据的切片
s2=pd.Series(np.random.randn(1000),index=pd.date_range('2013-11-1',periods=1000))
s2['2015']
s2['2015-03']
s3=pd.Series(np.random.randn(20),index=pd.date_range('2019-11-1',periods=20,freq='2D'))
s3
print(s3['2019-11-04':'2019-11-13'])
2019-11-05   -0.683197
2019-11-07   -2.341091
2019-11-09   -1.414898
2019-11-11    1.489353
2019-11-13    1.153365
Freq: 2D, dtype: float64

  • 重采样与频率转换

重新采样是指将时间序列从一个频率转换为另一个频率的过程。
将更高频率的数据聚合到低频率称为 下采样
从低频率转换到高频率称为 向上采样
pandas对象都配有resample方法,该方法是所有频率转换的工具函数

DataFrame.resample(self, rule, how=None, axis=0, fill_method=None, closed=None, label=None,
convention=‘start’, kind=None, loffset=None, limit=None, base=0, on=None, level=None)

重要参数:
·rule:重新采样的规则
·how:EOL End of Life
·axis:按行或者按列
·fill_method:EOL
·closed:起止时间是否包含在内
·label:用左边或者右边标记重采样后的结果
·convention:只适用于PeriodIndex
·kind:区间聚合(period)或是时间戳聚合(timestamp)
·limit:EOL

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值