Pandas基础操作
1、读取CSV
CSV(Comma-Separated Values,逗号分隔值,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。
pd.read_csv(filepath_or_buffer,
sep=',', header='infer', names=None, index_col=None,
usecols=None, prefix=None, skiprows=None,
skipfooter=0, nrows=None, skip_blank_lines=True,
)
👍其中值得注意的是:
- header
- 默认将待读取数据第一行作为标题行:如果待读取的数据没有标题行,则注意设置header=None,
- index_col
- 可以设置某一列作为整个数据的索引:如果不指定,则会默认设置自然索引
2、索引操作
2.1建立索引
-
1)在读取数据时指定索引
df = pd.read_excel(data, index_col='name') # 设置索引为 name
-
2)使用df.set_index()
df.set_index('month') # 设置月份为索引 df.set_index(['month', 'year']) # 设置月份和年为多层索引
👍注意:在上述(2)操作中,并没有修改原来的df变量中的内容,如果希望设置索引后的数据替换原来的df变量中的内容可以通过:
-
1)、赋值操作
df = df.set_index('month')
-
2)、传入inplace参数
df.set_index('month',inplace=Ture)
事实上,df的很多操作都是不修改df变量中的数据的,这也是为了数据的安全操作。
2.2其他一些操作
df.reset_index():将所有(也可部分)的索引去除,恢复到自然索引(0-n)值
df.rename():修改行列的索引值,要提供原有的索引值
df.set_axis():将所需索引值指定给指定轴,不需要原有的索引值
df.rename_axis():设置轴的索引名
df.reindex():对现有的索引按给定的索引值顺序排列,如不存在的值为 Nan,支持缺失值填充方法
df.reindex_like():取其他表的索引值作为自己的索引值,相当于 df.reindex(index=other.index, columns=other.columns,...)
df.sort_index():按索引值(可指定轴)对数据进行排序
3、数据的信息
-
1)查看样本
df.head() df.tail() df.sample()
-
2)数据形状
df.shape #会返回一个数组,第一个代表行数,第二个代表列数,这就是这个数据的基本形状,也是数据的大小。
-
3)基础信息
df.info() #显示有数据类型、索引情况、行列数、各字段数据类型、内存占用等。Series 不支持。
-
4)数据类型
df.dtypes #会返回每个字段的数据类型。
👍如果是series对象则是不加s的 s.dtype
-
5)行列索引内容
df.axes #会返回一个列内容和行内容组成的列表 [列索引, 行索引]。
-
6)其他信息
df.index #返回行索引内容 df.columns #列索引内容
4、统计计算
-
1)描述统计
df.describe() #会返回一个有多个行的所有数字列的统计表,每个行是一个统计指标,有总数、平均数、标准差、最大最小值、四分位数等。 #无数字列则会输出与字符相关的统计数据
-
2)数学统计
df.mean()
df.max()
df.min()
df.abs()
...
👍注意:在使用这些统计函数时可以指定axis=1/‘columns’ 或者axis=0/‘index’
这里区分一下这两者的区别!
-
axis=1/‘columns’
比如说:df.mean(axis=1):意思是跨列操作,一次只能读一列,比如说先读到0行0列,再读到0行1列...直至列依次跨完后,就会得到每一行的不同均值
df.mean(1).head() ''' 0 49.50 1 41.75 2 54.75 3 84.50 4 65.25 dtype: float64 '''
-
axis=0/‘index’
比如说:df.mean(axis=0):意思是跨行操作,一次只能读一行,比如说先读到0行0列,再读到1行0列
因此df.mean(axis=0)计算的是每一列的不同均值df.mean(0).head() ''' Q1 41.75 Q2 54.75 Q3 84.50 Q4 65.25 dtype: float64 '''
-
3)非统计计算
#逻辑运算 df.any(df["Q1">=60]) #选出满足“Q1”>=60的行 df.all() #指定列保留几位小数(四舍五入) df.round({"Q1":2,"Q4":3}) #每个列的去重数量(注意与s.unique的区别!) df.nunique()
👍 Series专用的函数,而且常用的
s.value_counts() #计算不重复值的数量
s.unique() #去重
5、位置计算
-
位置差值diff()
#计算本行与前一行的差值(即当前值比上一行增加了多少) #无前一行的本行值为 NaN df.diff() df.diff(axis=1) #跨列操作,计算该行值在 当前列和左一列的差值 df.diff(2) #当前行与前2行 这两行的差值 df.diff(-1) #新的本行为本行减去后一行
-
位置移动shift()
#整体下移一行,最顶的一行为 NaN df.shift() df.shift(3) # 下移三行 #整体上移一行,最底的一行为 NaN df.shift(-1) #向右移动一位 df.shift(axis=1) df.shift(3, axis=1) #向右移三位 #向左移动一位 df.shift(-1, axis=1)
-
位置序号 df.rank()
生成数据的排序值,并用排序值替换原来的数据值(可以指定轴)df.rank(axis=1) #横向排名,计算该数值在不同列间的排序值
6、数据选择
操作 | 语法 | 返回结果 |
---|---|---|
选择列 | df[col] | Series |
按索引选择行 | df.loc[label] | Series |
按数字索引选择行 | df.iloc[loc] | Series |
使用切片选择行 | df[5:10] | DataFrame |
用表达式筛选行 | df[bool_vec] | DataFrame |
👍其中值得注意的
- 1、切片区间左闭右开
- 2、df.loc[<行表达式>,<列表达式>]非常灵活,表达式可以是列表、或者标签切片(闭区间)
参考文档
1、《深入浅出Pandas》