pandas
处理除了数值型的数据之外的其他类型数据
-
常用数据类型
- Series 一维数据,带标签的数组
- DataFrame 二维数据
-
创建Series数组
pd.Series([1,23,2,2,1], index=list(“abcde”))
也可以用字典转换到Series
-
转变数值类型
t2.astype(float)
切片和索引
-
获取值
可以是键,也可以是下标
例如:t3[“age”], t3[2]
-
取不连续的几行
t[ [“age”,“tel”] ]
-
布尔索引
t[t>10]
-
所有下标(键)
xx.index
-
所有值
xx.values
读取外部数据
-
读取csv
df = pd.read_csv("./dogName2.csv")
还可以读很多格式的文件
比如html, json, sql…
对于没有对应功能的格式或者文件,例如Mnogodb,可以先存到pandas中,再用一系列(DataFrame)操作
DataFrame
二维,Series容器
-
命名索引名称
pd.DataFrame(np.arange(12).reshape(3,4),
index=list(“abc”),
columns=list(“WXYZ”))
-
字典传入DataFrame
- 列表里有多少数据表示DataFrane有多少行
- 也可以用存字典的列表传入
基础属性
-
行坐标
t2.index
-
列坐标
t2.columns
-
所有的值(存了一个个对象的数组)
t2.values
-
形状(几行几列)
t2.shape
-
每一列是什么类型
t2.dtypes
-
数据的维度
t2.ndim
-
显示头部几行
df.head(3)
-
显示尾部几行
df.tail(3)
-
一些信息,行数、列数、列索引、列类型…
df.info()
-
统计数字列的情况,平均值、方差…
df.describe()
消除不想要的数据(列)
从大的数据中通过for循环获得一小部分列,存在另外一个列表中
-
按某列的顺序排序
df.srot_values(by=“Count_AnimalName”,
ascending=False(降序))
-
取行或者列
df[:20]
#前20行
df[‘Row_Labels’]
#取列索引
-
通过标签索引行数据
t3.loc[字符串或者字符串列表,字符串或者字符串列表]
例如:t3.loc[‘A’,:]
注意:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fGlNBFFP-1611656236484)(04_pandas.assets/image-20210123111351787.png)]
-
通过位置索引行数据
t3.iloc[[0,2,[2,1]]
-
布尔索引
df[ df[“count”] > 800
t3[ pd.notnull( t3[‘W’] ) ]
字符串方法
contains
len
lower, upper
replace
split
例如:
df[‘info’].str.split(’/’).tolist()
#用/切割一行行数据,然后保存到一个大列表中
缺失数据处理
-
判断数据是否为NaN
pd.isnull(df)
pd.notnull(df)
-
处理方式
- 删除NaN所在的行列dropna(axis=0,how=‘any’,inplace=False)
#0删除行,all表示当前行全部为NaN才删;any表示有1个为NaN就删,inplace表示原地替换将矩阵换成之后的结果
-
填充数据。t2.fillna(0)
t2.fillna(t2.mean())
#将平均值填充到所有列的NaN中来
只填充一列
t2[“age”] = t2[“age”].fillna(t2[“age”].mean())
在numpy中含有NaN的列的平均值为Nan
在pandas中含有NaN的列的平均值会忽略NaN
处理为0的数据(0是否没有意义):
t[t==0] = np.nan
-
获得全部导演(名字的列表)的数量
len(df[“Director”].unique())
-
获得多个电影的演员人数:
展平放在一个列表中,再利用集合set唯一化
- 获得最大值、最小值、、和它们的位置
例子:统计电影类型
数据合并
-
join
默认把行索引相同的数据合并到一起
-
merge
按照指定的列把数据按照一定的方式合并到一起
df1.merge(df3,on=“a”,how=“inner”)
how:
-
inner 交集
-
outer 并集,NaN补全
-
left 左边为准,NaN补全
-
right 右边为准,NaN补全
-
分组和聚合
分组
df.groupby(by=“columns_name(Country)”)
返回DataFrameGroupBy对象
-
可以进行遍历
for i.j in grouped:
print(i,j)
按“国家”分类,每一个都为元组,前面i是“国家”,后面j是DataFrame(当前数据全部为该“国家”的DataFrame)
元组(索引(分组的值),分组之后的DataFrame)
-
按照多个条件进行分组
PPT134页描述详细
前面两列一起为索引(复合索引),后面为数据,类型为Series
要想返回DataFrame类型,只需要在加一个[]方括号,例如df[[“Brand”]]
PPT135页
索引的方法和属性
-
获取index
grouped1.index
-
指定index
df1.index = [“a”,“b”]
-
重新设置index
df.reindex(list(“abcdef”))
#不存在的会设置为NaN,相当于对其取行
-
指定某一列作为index
df1.set_index(“a”,drop=False(False为保留a列))
-
返回index的唯一值
df.set_index(“Country”).index.unique()
-
可以是复合索引
例子
-
交换(前后两个)索引的位置
d. swaplevel()
聚合
-
统计全部国家的公司个数
grouped[“Brand”].count()
可以取特定列统计(例如Brand,也可以是Country,没有NaN)
时间序列
-
生成一段时间范围
pd.data_range(start=None,end=None,periods=None,freq=‘D’)
- 常见的频率的缩写
10D:表示10天
-
时间字符串转化为时间序列(字符串转类型对象)
df[‘timeStamp’] = pd.to_datatime(df[‘timeStamp’],format="")
#format可以帮助格式化时间字符串(可以查阅python datetime),比如包含中文
-
重采样
指的是将时间序列从一个频率转化为另一个频率进行处理的过程
- 将高频率数据转化为低频率数据为降采样
- 低频率转化为高频率为升采样
pandas可以用resample方法实现频率转化
-
t.resample(“M”).mean()
#按月份取平均值
-
t.resample(“10D”).count()
#10天计数
-
时间段
periods = PeriodIndex(
year=data[‘year’],
month=data[‘month’],
day=data[‘day’],
hour=data[‘hour’],
freq=‘H’)
#功能:把分开的时间字符串通过periodIndex方法转化为pandas的时间类型
之后可以添加1列到数据中
指的是将时间序列从一个频率转化为另一个频率进行处理的过程
- 将高频率数据转化为低频率数据为降采样
- 低频率转化为高频率为升采样
pandas可以用resample方法实现频率转化
-
t.resample(“M”).mean()
#按月份取平均值
-
t.resample(“10D”).count()
#10天计数
-
时间段
periods = PeriodIndex(
year=data[‘year’],
month=data[‘month’],
day=data[‘day’],
hour=data[‘hour’],
freq=‘H’)
#功能:把分开的时间字符串通过periodIndex方法转化为pandas的时间类型
之后可以添加1列到数据中