Series
一维同构列表,长度不可改变
创建
# 值列表
srs = pd.Series([1, 3, 5, 7])
数据清洗
# str 方法
srs.str.lower()
srs.str.upper()
srs.str.len()
srs.str.strip()
srs.str.lstrip()
srs.str.rstrip()
DataFrame
带标签的,大小可变的二维异构表格, 大小可改变
创建
# 创建空DF
df = pd.DataFrame(columns=('id','name','grade','class'))
# 从字典创建
data = {
"label":np.linspace(1,4,4),
"data":['zhangsan','李四','111','222']
}
df = pd.DataFrame(data, index=[1,2,3,4]) # 无 index 默认从0开始
# 从numpy数组创建
data = np.random.randn(6,4) # 6行4列
df = pd.DataFrame(data, columns=list('ABCD'))
查看
返回值若为二维,类型一般都为 <class 'pandas.core.frame.DataFrame'>
;
若为一维, 类型一般都为 <class 'pandas.core.series.Series'>
;
若为单个标量,类型一般会被尝试转为python基本对象。
# 头尾
df.head(n)
df.tail(n)
# 索引与列
df.index
df.columns
# RangeIndex(start=0, stop=4, step=1)
# Index(['label', 'data'], dtype='object')
# 统计摘要
df.describe()
# 转置
df.T
# 排序
df.sort_index(axis=1, ascending=False)
df.sort_values(by='col_name')
选择
二维方法中取一维结果通常会被降维。
但高维数据当作低维参数结果一般不会被降维,如[[index]]
可能得到一个长度1的Series
数组,但[index]
得到的可能为一个标量。
选择到的标量元素可直接赋值。
按标签
# 获取行 [index]
df.loc[0]
# 获取列
df['col_name']
df.col_name
# 获取行列
df.loc[0:2, ['col_1', 'col_2']]
# 标量
df.loc[1, 'col_name']
df.at[1, 'col_name']
按位置
# 获取行 [index]
df.iloc[2]
# 获取列
df.iloc[:, 2]
# 行列切片
df.iloc[1:2, 1:3]
df.iloc[[1, 3], [2, 4]]
# 获取标量
df.iloc[1, 2]
df.iat[1, 2]
布尔索引
# r: dataframe
# 类似 select where
df[df.col > 0]
# 全部元素筛选
df[df > 2]
# 包含判断
df2[df2['col'].isin(['11', '22'])]
数据清洗
可通过处理dataframe
的series
数组局部清洗数据,此处略。
NAN处理
# 删除所有含NAN的行
df.dropna(how='any')
# 用默认值替换所有NAN
df.fillna(value=5)
# 获取NAN的布尔掩码
pd.isna(df1)
合并
# 连接
df = pd.concat([df1, df2])
方法
对批量元素执行函数
# 整列元素执行函数
df['new_col'] = df['old_line'].apply(function)
# 添加进度条
from tqdm import tqdm
tqdm.pandas()
df['new_col'] = df['old_line'].progress_apply(function)