Pandas入门
-
Series
:数据系列,代表一维数据,比numpy中的一维数组强大。 -
DataFrame
:数据窗/数据框/数据表,代表二维数据,封装了数据分析常用的各种方法。 -
Index
:索引,为Series
和DataFrame
提供数据索引服务。
1 Series
1.1.1 创建Series对象
方法一:通过列表的方式,index若不设置,默认为0,1,2,3
ser1 = pd.Series(data=[320, 180, 360, 450, 520], index=[f ‘{x}季度’ for x in ‘一二三三四’])
ser1
方法二:通过字典的方式
ser2 = pd.Series(data={‘一季度’: 320, ‘二季度’: 180, ‘三季度’: 450, ‘四季度’: 520})
ser2
1.1.2 Series 的索引和切片
索引:
1.
ser1[‘三季度’]
三季度 360
三季度 450
ser2.一季度
320
2.花式索引
ser1[ [ ‘一季度’, ‘三季度’,‘一季度’ ] ]
一季度 320
三季度 360
三季度 450
一季度 320
3. 布尔索引
ser1[ser1 >= 400]
三季度 450
四季度 520
切片:
1.ser1[1:3] - - - > (前开后闭)
二季度 180
三季度 360
2. ser1[‘二季度’: ‘三季度’] - - - > (前闭后闭)
二季度 180
三季度 360
三季度 450
1.1.3 Series的常见属性
ser2.index - - - > 获取索引
Index([‘一季度’, ‘二季度’, ‘三季度’, ‘四季度’], dtype=‘object’)
ser2.index.values - - - > 获取索引的值
array([‘一季度’, ‘二季度’, ‘三季度’, ‘四季度’], dtype=object)ser2.values - - - > 获取数据
array([320, 180, 450, 520], dtype=int64)ser2.size - - - > 元素个数
ser2.is_unique - - - > 元素是否唯一
ser2.hasnans - - -> 判断有无空值,有就返回True,没有返回False
ser2[‘二季度’] = np.nan - - - > 赋空值
1.1.4 Series 对象的方法
1.获取描述性统计信息 —> 集中趋势
求和:
print(ser2.sum()
)
求平均:
print(ser2.mean()
)
中位数:
print(ser2.median()
)
print(ser2.quantile())
众数:
print(ser2.mode()
)
2. 获取描述性统计信息 —> 离散趋势
最大值和最小值
print(ser2.max()
)
print(ser2.min()
)
极差
print(np.ptp(ser2))
方差和标准差
print(ser2.var()
)
print(ser2.std()
)
上下四分位数
print(ser2.quantile(0.25)
)
print(ser2.quantile(0.75)
)
3. 获取描述性统计信息 - - - > describe()
ser2.describe()
count 4.000000
mean 422.500000
std 84.212034
min 320.000000
25% 380.000000
50% 425.000000
75% 467.500000
max 520.000000
4. 去重
ser3 = pd.Series([‘apple’, ‘banana’, ‘apple’, ‘pitaya’, ‘apple’, ‘pitaya’, ‘durian’])
ser3.unique() - - - > 去重
array([‘apple’, ‘banana’, ‘pitaya’, ‘durian’], dtype=object)
ser3.duplicates() - - - > 判断元素第一次出现还是重复出现
,返回布尔数组
ser3.drop_duplicates() - - - > 去重
(重复的元素默认保留第一项,默认值keep=first,keep=last是保留最后一项,keep=False代表只要是重复的就去掉)
0 apple
1 banana
3 pitaya
6 durian
dtype: object
ser3.nunique() - - - > 不重复元素的个数
ser3.value_counts() - - - > 元素重复的频次
(按频次降序排列)
apple 3
pitaya 2
banana 1
durian 1
dtype: int64
5. inplaceinplace
- 是否就地进行操作 :
True —> 就地操作,不返回新的对象 —> None ;
False(默认值)—> 返回操作后的新对象 —> Series
ser3.drop_duplicates(keep=False, inplace=True)
1 banana
6 durian
dtype: object
6. 判断空值
ser4 = pd.Series(data=[10, 20, np.NaN, 30, np.NaN])
ser4
ser4.isnull()
- - - > 判断空值,是空返回True,不是空返回False
ser4.notnull()
- - - > 判断非空值,非空返回True,空返回
ser4[ser4.notnull()] - - - > 通过布尔索引筛选非空值
7. 删除
ser4.drop(index=2) - - - > 删除指定的值
ser4.dropna() - - - - > 删除空值
8. 填充空值
ser4.fillna(50) - - - > 填充空值
ser4.fillna(method=‘ffill’) - - - > 用前面的填充
ser4.fillna(method=‘bfill’) - - - > 用后面的填充
9.排序
给索引排序:ascending —> 升序还是降序 —> 默认值True,代表升序
ser1.sort_index(ascending=False)
给值排序:
ser1.sort_values(ascending=False)Top-N
:
ser1.nlargest(3)
ser1.nsmallest(2)
10.函数map() ,apply()
ser5 = pd.Series(data=[‘32’,‘89’,‘100’,‘56’,‘47’])
ser5
注意:此处ser5为字符串类型
ser5.map(int).mean() - - - > 映射为整型即可运算
一组成绩:ser6 = pd.Series(np.random.randint(30, 80, 10))
定义计算成绩的函数:
def upgrade(score):
return score ** 0.5 * 10
利用apply计算成绩法一:
np.round(ser6.apply(upgrade),0)
利用apply计算成绩法二:
np.round(ser6.apply(lambda x: x ** 0.5 * 10), 0)
11. where 、mask
ser8=pd.Series(np.random.randint(1,100,10))
ser8.where(ser8 > 30 , 30) - - - > 满足条件的保留,不满足条件的替换为30
ser8.mask(ser8 > 30 , 30) - - - > 满足条件的数据替换为30,不满足条件的保留
12.线性归一化、零均值归一化
线性归一化(标准化):
零均值归一化(中心化):
ser7 = pd.Series(data=np.random.randint(150, 550, 7),index=[f’{x}季度’ for x in ‘1123344’])
线性归一化:
x_max, x_min = ser7.max(), ser7.min()
ser7.apply(lambda x: (x - x_min) / (x_max - x_min))
零均值归一化:
mu,sigma = ser7.mean(),ser7.std()
ser7.apply(lambda x: (x - mu) / sigma)