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