Pandas
文章目录
pandas v.s.numpy
numpy处理数值,pandas可对其它类型的数据进行处理
pandas常用数据类型
- Series
- DataFrame
Series
Series对象本质由两个数组构成,键+值;ndarray的很多方法都可以用于series类型
P.S. 注意where方法稍有不同,不符合条件的不变或者赋值为nan
# key
print(t1.index)
print(type(t1.index))
# value
print(t1.values)
print(type(t1.values))
Index(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'], dtype='object')
<class 'pandas.core.indexes.base.Index'>
[0 1 2 3 4 5 6 7 8 9]
<class 'numpy.ndarray'>
Series创建
import pandas as pd
import numpy as np
import string
# create via range
t1 = pd.Series(np.arange(10),index=list(string.ascii_uppercase[:10]))
# create via dictionary
a = {string.ascii_uppercase[i]:i for i in range(10)}
t2 = pd.Series(a)
# if index is changes, new indexes points to nan
t3 = pd.Series(a,index=list(string.ascii_uppercase[5:15]))
切片和索引
# start,end and step
t1[2:10:2]
# single
t1[2]
t1[[2,5,7]]
# condition
t1[t1>4]
# via index
### P.S. query with any missing index is no longer supported
t1["F"]
t1[["A","F","G"]]
DataFrame
创建DataFrame
DataFrame对象既有行索引(index,axis=0),又有列索引(columns,axis=1)
同样可以由字典创建
t = pd.DataFrame(np.arange(12).reshape(3,4), index=list(string.ascii_uppercase[:3]), columns=list(string.ascii_uppercase[-4:]))
DataFrame属性
- df.shape
- df.dtypes
- df.ndim # 数据维度
- df.index
- df.columns
- df.values # 对象值,二维ndarray数组
DataFrame查询
- df.head(3) # 显示头部几行 default 5
- df.tail(3) # 显示末尾几行 default 5
- df.info() # 相关信息:行数、列数、列索引、列非空值个数、列类型、内存占用
- df.describe() # 快速综合统计结果:计数、均值、标准差、最大值、四分位数、最小值
- df.sort_values(by=" ",ascending=False) # 排序
索引
-
切片
# 行和列的索引,可分开索引 t[:2]["X"]
-
loc & iloc
df.loc:通过标签索引行数据;df.iloc:通过位置获取行数据t.loc[["A","C"],["W","Z"]] t.iloc[[0,2],[1,3]
-
布尔索引(P.S. 不同条件要用括号括起来)
df[(df["Row_labels"].str.len()>4) &(df["Count_AnimalName"]>700)]
字符串方法
缺失数据的处理
两种情况:nan or 0
- nan
判断数据是否为nan:pd.isnull(df),pd.notnull(df)
两种方法:- 删除→t.dropna(axis=0,how=‘any’,inplace=‘False’)
how:any表示只要有任何一个为nan删除,all表示全部为空值才删除
inplace:如果为true,则原数据会被改变 - 填充数据→t.fillna(t.mean()) or t.fillna(0)
- 删除→t.dropna(axis=0,how=‘any’,inplace=‘False’)
- 0
计算平均值等情况,nan不会参与运算,而0会,所以在某些情况下需要对0值进行处理
t[t==0]=nan
P.S. DataFrame会自动进行数据类型转换,因此赋值空值的时候不需要进行类型转换
读取外部数据
pd.read_csv()
pd.read_sql
…
合并数据
join
merge
按照指定的列把数据按照一定的方式合并到一起(替代:SQL处理完成后再导入)
分组 & 聚合
- df.groupby(by=[‘column_name’,'column_name]):返回一个DataFrameGroupBy对象,可迭代,其中每一个元素是一个组,元组里面是(索引,分组之后的DataFrame)
- DataFrameGroupBy中的方法
索引 & 复合索引
简单的索引操作
- df.index:获取索引
- df.index=[‘x’,‘y’]:重命名索引
- df.reindex(‘a’,‘f’):本质为取行,本身没有的index会是空值
- df.set_index(‘Contry’,drop=‘False’):将其中一列作为索引(成为索引后如果成为false,原列也不删除);可设置多个索引:df.set_index([‘a’,‘b’])
- df.set_index('Country).index.unique()
Series复合索引
- Series复合索引,直接在括号中写索引
Example: X[‘one’,‘g’] - swaplevel():从内层开始取值
DataFrame复合索引
Example: X.loc[‘one’].loc[‘g’]
X.swaplevel().loc[‘g’]
时间序列
DatetimeIndex
- 生成一段时间范围
pd.date_range(start=None, end=None, periods=None, freq=‘D’)
start end freq:生成start和end范围内以频率freq的一组时间索引
start periods freq:生成从start开始的频率为freq的periods个时间索引
- 时间字符串转为时间序列
pd.to_datetime(series,format="") - 重采样
将时间序列从一个频率转换为另一个频率
Example:t.resample(“M”).mean(), t.resample(“10D”).count()
PeriodIndex
- 生成一段时间范围 periods=pd.PeriodIndex(year=data[“year”],month=data[“month”],day=data[“day”],hour=data[“hour”],freq=“H”)
- 降采样 data=df.set_index(periods).resample(“10D”).mean()