pandas 命令查阅
了解 熟悉 ==掌握== 精通
默认改ipython
IPYTHONDIR/profile_default/startup
新建一个py
import pandas as pd
# -----
# 设置
# -----
# 显示所有列
pd.set_option('display.max_colums', None)
# 显示所有行
pd.set_option('display.max_rows', None)
# 设置value的显示col为100 (默认50)
pd.set_option('max_colwidth', 100)
# -----
# 读写
# -----
# 读写有许多通用的参数
可接受类型:read_*, to_*。*可为:
csv, excel, json, html, sql, pickle, hdf, feather, parquet
# 读文档,逐行读
data = pd.read_csv("your_file.csv", chunksize=1)
# 读excel,读前10行,第2,3张表
# sheet_name可接受str即名字,int即index和list
data = pd.read_excel("file.xlsx", nrows=10, sheet_name=[1,2])
# 读进来一个保存了index的数据,但是index那列没名字需要改名
data.rename(columns={'Unnamed: 0': 'new_name'}, inplace=True)
# 写
data.to_csv('file.csv', encoding='utf-8-sig', header=True, index=False) # header和index默认都为true
pandas写的时候默认不会将任何列作为索引,如果需要,可以用参数index_col指定,值可以为该列顺序也可以为列名
# 读写数据库
from sqlalchemy import create_engine
# 创建一个数据库引擎
engine = create_engine('sqlite://', echo=False)
df = pd.read_sql("SELECT * FROM table_name", con=engine) # "con="可省略
df.to_sql('users', con=engine, if_exists='replace', index=False)
if_exists 如果表存在可选:
① fail,不操作并抛出valueerror
② replace,【删除】并替换
③ append,追加
# 返回前a行
.head(a)
# 返回尾a行
.tail(a)
# 返回某行索引名字
.iloc[i].name # i
# 返回列名
.columns
# 按行遍历
for index, row in data.iterrows():
# 取某行
df.iloc[[行index]]
df.loc[[行名]]
# 取列A
df.loc[:, 'A']
# 取某行某列
df.loc[行名, 列名]
# 取a列和c列的前两行
df.loc[0:2, ['A', 'C']]
# 选择列'B' 值为指定value的行
df.loc[df['B']==value]
# 选择列'B' 值在list的行
df.loc[df['B'].isin(['a', 'c'])]
# 反过来包含?
df[df['city_name'].str.contains('北京')]
# 选择某列 值不等于value的行
df.loc[df['column_name']!=value]
# 选择某列 值不在可迭代values的行
df.loc[~df['column_name'].isin(values)]
# 多条件过滤(要有括号)
dataframe[(mydf.colA==chunks[0]) & (mydf.colB==beta[0][0])]
# 选任意出现空值的一行
df[df.T.isnull().any()]
# 选任意没有空值的一行
df[~df.T.isnull().any()]
# 选了特定类型的列的列名
.select_dtypes(inclues=['datetime64']).columns[0]
# 某列最大值的那行的index
series.idxmax() # idxmax和argmax一样,但是idxmax可以用在dataframe,所以多用这个。
# 多层索引选择
df.loc[('A', slice(None)),:]
# loc[(a, b), c]中第一个参数元祖为索引内容,a为level0索引,b为level1,c为列(dataframe专有)
# slice(None) 是python中的切片操作,这里用来选择任意id
# ':'用来指定dataframe任意列
# -----
# 添加
# -----
# 添加一行
df = pd.DataFrame(columns=['r1', 'r2', 'r3'])
for i in range(5):
df.loc[i] = [randint(-1, 1) for j in range(3)]
# 添加一列
df['col1'] = [2, 3, 4, 2, 2]
# -----
# 改动
# -----
# 把data的一部分(carID,carType,fatherCar)三列赋值给car
car = pd.DataFrame(data, columns=['carID', 'carType', 'fatherCar'])
# 替换None
df = df.replace([None], 'something')
# ❗️【值里有NaN时会变浮点】
# ==== 处理每个元素 ====
# 将存在一个属性,由空格分隔的字符串分开成list
data['cartype'] = data['cartype'].str.split(' ', 1)
data['cartype'][0]
>>> ['2014款‘, '1.3L']
data['cartype'].str[0].head(0)
>>> 2014款
# 用str之后分成两列
data['name'].str.split('|', expand=True)
# 最值
# 某列最值
data['col'].max()
data['col'].min()
# 某列最值所在的行索引
data['col'].idxmax()
data['col'].idxmin()
# -----
# 合并
# -----
merge和concat都返回新数据
# merge 主要是交叉
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True)
# on='key' 指定连接的列名,表示以key列为主键进行连接。前提是两列都有这个列
# 若两列列名不一样,可以通过left_on='key1'和right_on='key2'来合并
# 如果想用index合并,就要设left_index=True和right_index=True。
# how='inner' 指合并时存在不重合的行时,取结果的方式:inner交集,outer并集,left/right取某一边,left就是保持左边行数不变,拿右边表与之合并
#
# concat 主要是拼接
concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verigy_integrity=False)
# 只是合并两个表,可以横向拼接也可以纵向拼接,用axis控制,默认0为纵拼接
# objs 为被拼接的对象集合,一般为列表或字典
pd.concat([df1, df2]) 相当于 df1.append(df2)
pd.concat([df1, df2], axis=1) 相当于 merge(df1, df2, left_index=True, right_index=True, how='outer')
# a和b取差集
a.append(b)
a = a.drop_duplicates(keep='false')
# keep='false' 意思是凡重复的都去掉。默认为true,就是保留第一条记录。
# -----
# index操作
# -----
# 重新设置DataFrame的index
.reindex(columns=一个index名字的list) # 里面的index name可以已有也可以没有
# reindex 和rename的区别是,reindex是改索引那一列,rename是更改现有的索引的名称
# 已存在正常列转化成index
.set_index('aCol', inplace=True)
# index转化成正常的列
.reset_index() # 重设索引用 df.reset_index(drop=True)
# columns 换名字
.rename(columns={'index':'month_rank', 2:4}, inplace=True)
df.columns = df.columns.map(lambda x:x[1:])
df.columns = df.columns.str.strip('$')
df.rename(columns=lambda x:x.replace('$', ''), inplace=True)
# series 改名的时候不用加columns
.rename({'relation':'relationBefore'}, inplace=True)
# 选择特定的index
.loc[select_index] # select_index是一个list
# -----
# 删除
# -----
# 删除16,17行,返回新表
.drop([16, 17])
# 删除列'ax',在原地删除
.drop(['ax'], axis=1, replace=1)
# 去重。找出和显示重复值。不重复为false,重复为true。支持从前查找和从后查找
.duplicated()
# 去重。删除数据表的重复值,判断标准和逻辑和⬆️一样。返回一个只包含唯一值的数据表
.drop_duplicates()
# 删除指定列('age', 'sex')含有空数据的全部行
df = df.dropna(subset=['age', 'sex'])
# 删除全部
del df
如果还怕内存爆可以用gc模块
import gc
gc.collect()
# ------
# 格式转换
# ------
# 查看数据类型
data.dtypes
# 查看index类型
data.index.dtype
>>> dtype('O') 对象类型(Object type),这通常意味着索引是字符串类型
# datetime类型只保留年月日,去掉时间
data['public_time'].dt.normalize()
# datetime转str
data[col].dt.strftime('%Y-%m-%d %H:%M:%S')
# str转datetime
dates = pd.to_datetime(pd.Series(['20010101', '20010331']), format='%Y%m%d')
# pandas转python list
.value.tolist()
# 把data转换成python可用的data格式
t.to_pydatetime() # 出来格式是datetime.datetime(2016, 3, 3, 0, 0)
t.date() # 出来格式是datetime.date(2016, 3, 3)
# int64换成int32
cols = tt.select_dtypes(include=['int64']).columns
tt[cols] = tt[cols].astype('int32')
# ------
# 排序、groupby 和 apply
# ------
# A列降值排序
pd.sort_values(by='A', inplace=True, ascending=False)
# by 可以是str或list
# axis=0时 by='列名‘;axis=1时 by='行名'
# 分组并排序
df.sort_values(['name', 'score'], ascending=[True, False], inplace=True)
df[参与的列们].groupby(按该列分组)[对该组运算].sum()
# 按A分类,求其他列均值
df.groupby('A').mean()
# 按A、B分类,求C列之和
df.groupby(['A', 'B'])['C'].sum()
# 按A分类,求B列均值及C列之和
df.groupby(['A']).agg({'B':'mean', 'C':'sum'})
# size和count的区别:size计数时包含NaN值,而count不包含
# 复杂计算 用lambda
df.groupby('A').apply(lambda x:(x['C']-x['B']).mean())
# 根据函数、数组分类: key_list = ['one', 'one', 'one', 'two', 'two']
groupby([len, key_list]).min()
# transform: 保持和原始数据集相同数量的项目
df['order_total'] = df.groupby('order')['ext price'].transform('sum') # 可直接写进原df
# apply: DataFrame/Series。f是函数,函数的参数x是series,整行/整列
apply(f) # 列
apply(f, axis=1) # 行
# applymap: DataFrame/Series。f是函数,函数的参数x是每个元素
applymap(f)
# map: Series。x是每个元素
map(x)
# ------
# 绘制图像
# ------
import matplotlib.pyplot as plt
# 绘制线形图
df.plot(kind='line', y='col1') # 指定绘制某列
# 图类型:line, bar, barh(横向柱状), pie(饼), scatter(散点), box, kde(核密度)
# plot的第一第二个参数是x轴和y轴
# 保存图像
plt.savefig('your_file.png') # ❗️必须先保存再显示
# 显示图像
plt.show()
# 两组数据画到一个图上
ax = data1.plot()
data2.plot(ax=ax)
# ax是一个Axes对象,代表了图形中的一个绘图区域,先创建一个ax区域,然后在同个区域上画第二组数据