pandas和Series使用
Series
由数组和列表创建Series是一个浅拷贝(只拷贝引用地址,不拷贝对象本身)对象数值变化,数组也变
- from pandas import Series
- 引入Series
- Series([1,2,3,4,5],index=list("abcde"))
- 创建和索引
- Series({"a":1,"b":2,"c":3})
- 由字典创建
- s.values
- 显示值
- s.index
- 显示索引
- s[]
- 按字典索引
- s.ix
- 显示隐式都可
- s.loc
- 显示索引
- s.iloc
- 隐式索引
- s.size
- 大小
- s.shape
- 形状
- pd.read_csv("./titanic.txt")
- 读取csv文件
- 变量名.head(3)
- 前几条
- 变量名.tail(10)
- 最后几条
- pd.isnull()
- 判断是否为空
- pd.notnull()
- 判断是否为空
DataFrame
dic = {
"姓名":["狗蛋","刘德华","鹿晗","TF","张柏芝","谢霆锋"],
"语文":[120,130,140,110,110,100],
"数学":[130,110,100,100,100,120],
"外语":[120,130,123,125,112,143],
"综合":[230,240,254,234,100,100]
}
df = DataFrame(dic,index=list("abcdef"))
创建DataFrame
- df.columns
- 横索引
- df.index
- 纵索引
- df2.add(df1,fill_value=0)
- fill_value参数在补用它的值去填补缺失的地方
- (注意)原来既缺行又缺列的仍然补nan
- df.cumsum()
- ue.groupby(["contb_receipt_dt","party"])[["contb_receipt_amt"]].sum().unstack(level=1).cumsum().cumsum()
- 分完组之后累计求和
Python Operator | Pandas Method(s) |
---|---|
+ |
add() |
- |
sub() , subtract()
|
* |
mul() , multiply()
|
/ |
truediv() , div() , divide()
|
// |
floordiv() |
% |
mod() |
** |
pow() |
Series与DataFrame之间的运算
- 使用Python操作符:以行为单位操作(参数必须是行),对所有行都有效。(类似于numpy中二维数组与一维数组的运算,但可能出现NaN)
- 使用pandas操作函数:
- axis=0:以列为单位操作(参数必须是列),对所有列都有效。
- axis=1:以行为单位操作(参数必须是行),对所有行都有效。
-
df2.add(s_row,axis=1)
- df2中的与s_row同样的一行里面数值进行相加。
-
np.nan(NaN)
-
np.nan(NaN)
- np.nan是浮点类型,能参与到计算中。但计算的结果总是NaN。
- 但可以使用np.nan*()函数来计算nan,此时视nan为0。
- pandas中None与np.nan都视作np.nan
-
np.nansum(nd)
- 视nan为0之后求和。
-
pandas中None与np.nan的操作
-
df.isnull()
- 判断是否为空,按照dataframe形式显示
-
df.notnull()
- 与上述相反
-
df.isnull().all(axis=0)
- 判断每一列中的所有元素是否全为True,如果是则为True
-
df.isnull().any(axis=0)
- 判断每一列中是否有为True的元素,如果有一个为True,则为True
-
df.dropna(axis=1,how="any")
- axis 0 默认,代表操作行 1 代表操作列
- how "any"默认只要有缺失就丢弃 "all"所有的都缺失才丢掉
-
df.fillna(1000)
- 直接填补为nan的
-
df.fillna(method="bfill",axis=0)
- 拿后面的行标对应的值填充到前面的nan位置
-
df.fillna(method="ffill",axis=0)
- 拿前面的行标对应的值填充到前面的nan位置
-
隐式构造
-
s = Series(data=[100,98,89,90],
index=[["张三","张三","李四","李四"],["期中","期末","期中","期末"],
["a","b","a","b"]])
s- Series也可以创建多层索引
-
df = DataFrame(data=[100,98,89,90],
index=[["张三","张三","李四","李四"],["期中","期末","期中","期末"],
["a","b","a","b"]],
columns = ["python"]
)
df- DataFrame隐式构造
-
显示构造pd.MultiIndex
-
mindex =pd.MultiIndex.from_arrays([["a",'a','a','b','b','b'],
['一单元',"二单元","三单元",'一单元',"二单元","三单元"]])
mindex- 使用数组
-
mindex = pd.MultiIndex.from_tuples([("河南","郑州"),
("河南","洛阳"),
("山东","济南"),
("河北","石家庄"),
("北京","天安门"),
("四川","成都"),
("江苏","南京")])- 注意:每个元组代表一个行(或列)的索引名,索引名要用元组的元素来体现
mindex - 使用tuple
- 注意:每个元组代表一个行(或列)的索引名,索引名要用元组的元素来体现
-
mindex = pd.MultiIndex.from_product([["河南","山东"],['郑州','济南']])
mindex- 使用product
索引的堆
- df1.stack(level=1)
- 使用stack()的时候,level等于哪一个,哪一个就消失,出现在行里。
- df.unstack(level=2)
- 使用unstack()的时候,level等于哪一个,哪一个就消失,出现在列里。
过滤
- df.where(df>50,other=0)
- 这个函数是根据条件来过滤,并将不符合的改成0
级联
- pd.concat([df1,df2])
- 和np.concatenate一样,优先增加行数(默认axis=0)
- pd.concat([df1,df2],axis=1)
- 增加列数
- 注意index在级联时可以重复
- 也可以选择忽略ignore_index,重新索引
- 不匹配指的是级联的维度的索引不一致。例如纵向级联时列索引不一致,横向级联时行索引不一致(通俗的讲就是级联完了索引是1231234这种,并不是启用统一的级联)
- pd.concat([df1,df2],keys=["教学","品保"])
- 使用多层索引 keys
- pd.concat([df1,df3],axis=0,join="outer")
- 外连接
- 1、不匹配级联在外连接的模式下要求如果axis=0行级联列索引必须保持一致
- axis=1列级联行索引必须保持一致
- 2、如果不一致缺哪个索引就补全哪个索引
- pd.concat([df1,df3],axis=0,join="inner")
- 内连接:只连接匹配的项
- 内连接在级联的时候不一致的地方全部丢弃
- pd.concat([df1,df4,df5],axis=1,join_axes=[df1.index])
- 连接指定轴
合并
- df1.merge(df3)
- 使用pd.merge()合并时,会自动根据两者相同column名称的那一列,作为key来进行合并。
- df1.merge(df5,on="name",suffixes=["实际","假的"])
- 如果两个表有多个相同的属性,需要指定以哪一个属性为基准来合并
- df1.merge(df6,left_on="name",right_on="姓名")
- 如果两个表没有相同的属性,可以左边的表出一个属性,右边的表出一个属性,然后进行合并
- 这种合并两个属性不能并在一起
- df1.merge(df6,right_index=True,left_index=True)
- 用索引来合并
- df1.merge(df7,how="inner")
- 内合并:只保留两者都有的key(默认模式)
- df1.merge(df7,how="outer")
- 外合并 how='outer':补NaN
- df1.merge(df7,how="right")
- df1.merge(df7,how="left")
- 左和并:以左侧为基准,左侧有右侧没有补nan,左侧没有右侧有去掉
- 有合并:和上面相反
删除重复元素
- df.duplicated()
- 返回值为一个Series记录着每一行的重复情况,如果某一行不是第一次出现就认为他是重复
- 返回是否重复的bool值
- df.drop_duplicates(inplace=True)
- 删除重复数据
映射
- df.replace({"red":"blue","green":20},inplace=True)
- 把字典的键替换成值
- df["h5"].map(lambda x : x-40)
- 按照函数来替换
- df.rename(columns={"外语":"English"},index=func)
- 替换索引
异常值检测和过滤
- df.describe()
- 显示个数,平均数,标准差,最大值等信息
排序
- np.random.permutation()
- 函数随机排序(随机打乱)
- df.take([1,0,1])
- 按索引提取,一般与上个函数一起用
- ue.sort_values(by=["contb_receipt_dt"])
- 按照值排序
- data.sort_index(axis=1,ascending=False)
- 按照索引降序排列
数据聚合
- price_mean = df.groupby(["item"])[["price"]].mean()
- 分组后,按照组进行求和,平均等操作
- price_mean.round(2)
- round让结果在输出的保留几位小数
- df.groupby(["color"]).transform(sum)
- 高级数据聚合(显示样式有区别)
- df.groupby(["color"]).apply(sum)
- 高级数据聚合(显示样式有区别)
-
转换日期类型
- pd.to_datetime(ue["contb_receipt_dt"])
- 从字符串类型转到日期类型