之前在统计导出的订单数据时,有用到 pandas 模块,下面是自己常用的一些操作,当成备忘录做个总结
写数据
def data_to_csv():
"""
向CSV写入数据
Step1:生成表格型数据结构,确认文件内容表头字段
# pandas.DataFrame( data, index, columns, dtype, copy)
# data:一组数据(ndarray、series, map, lists, dict 等类型)。
# index:行标签
# columns:列标签
# dtype:数据类型
# copy:拷贝数据,默认为 False。
Step2:判断文件是否存在,存在则保留列名
Step3:将demo数据写入CSV
"""
try:
df = pd.DataFrame(
{'姓名': "张三", '性别': "男"}, index=[0])
# 判断文件是否存在 True:保留列名 False:反之
if os.path.exists(save_file):
# 文件存在
df.to_csv(save_file, encoding="utf-8", mode='a', index=False,
index_label=False, header=False)
else:
# 文件不存在
df.to_csv(save_file, encoding="utf-8", mode='a', index=False,
index_label=False, header=True)
except Exception as ex:
print('写入文件失败 {}'.format(ex))
raise ex
def data_to_mysql():
"""
读取csv写入数据到mysql to_sql csv文件内容字段顺序需要和数据库完全一致
:param insert_data:
:param table:
:return:
"""
try:
engine = create_engine(
'mysql+pymysql://{0}:{1}@{2}/{3}?charset=utf8'.format('mysql_username', 'mysql_password',
'mysql_host',
'mysql_db_name'), encoding='utf-8')
pandas.read_csv("filename").to_sql("mysql_table_name", engine, if_exists='append', index=False)
except Exception as ex:
print('插入数据异常{}'.format(ex))
raise ex
读数据
import pandas as pd
def read_csv_data():
"""
读取csv文件
:return:
"""
try:
content = pd.read_csv("filename")
print("文件内容 {}".format(content))
except Exception as ex:
print("读取csv文件异常 {}".format(ex))
raise ex
def read_excel_data():
"""
读取excel文件 指定sheet使用sheetname属性 sheet页码下标从0开始,或者直接传sheetname
:return:
"""
try:
content = pd.read_excel("filename",sheet_name=0)
# content = pd.read_excel(os.path.join(os.getcwd(), "..") + "\\**\\***.xlsx")
# 设置参数打印全行数据 反之会打印...隐藏部分行数据
pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)
print("文件内容 {}".format(content))
except Exception as ex:
print("读取excel文件异常 {}".format(ex))
raise ex
操作数据
# -- coding: utf-8 --
import pandas
def data_handle():
# 构建df
df1 = pandas.DataFrame([
{"商品链接": "https://mp.weixin.qq.com/s/Rh-9BiMD662BCXGdXMBbZw","下单量":1000,"商品单价": 0.33,"商品价格":33,"下单时间":11},
{"商品链接": "https://mp.weixin.qq.com/s/Y2-TuB33JXaNsNhaB7-PgQ", "下单量": 3600, "商品单价": 0.33, "商品价格": '', "下单时间": 12},
{"商品链接": "https://mp.weixin.qq.com/s/7K-prA5BDvy9ZBnmNCFyTg", "下单量": 1000, "商品单价": 0.32, "商品价格": 32,"下单时间": 12},
{"商品链接": "https://mp.weixin.qq.com/s/FT-prA5BDvy9ZBnmNCgHKL", "下单量": 500, "商品单价": 0.32, "商品价格": None, "下单时间": 12},
{"商品链接": "https://mp.weixin.qq.com/s/Rh-9BiMD662BCXGdXMBbZw", "下单量": 1000, "商品单价": 0.34, "商品价格": 34,"下单时间": 12},
{"商品链接": "https://mp.weixin.qq.com/s/GS-0SDFASHDSsasdsdc435", "下单量": 1000, "商品单价": 0.34, "商品价格": 34, "下单时间": 13},
{"商品链接": "https://mp.weixin.qq.com/s/LV-324234nkjfsfdscSASD", "下单量": 1000, "商品单价": 0.34, "商品价格": 34, "下单时间": 14},
{"商品链接": "https://mp.weixin.qq.com/s/WS-904955daBCXGdXMBbZw", "下单量": 1000, "商品单价": 0.34, "商品价格": 34, "下单时间": 14},
{"商品链接": "https://mp.weixin.qq.com/s/WS-904955daBCXGdXMBbZw", "下单量": 1000, "商品单价": 0.34, "商品价格": 34, "下单时间": 15}
])
df2 = pandas.DataFrame([
{"商品链接": "https://mp.weixin.qq.com/s/Rh-9BiMD662BCXGdXMBbZw", "下单量": 1000, "商品单价": 0.33, "商品价格": 33,"下单时间": 11},
{"商品链接": "https://mp.weixin.qq.com/s/XC-453RiMDWEREBCXGJGHR", "下单量": 500, "商品单价": 0.33, "商品价格": "", "下单时间": 12}
])
# 打印df数据
print(df1)
print(df2)
pandas.set_option('display.max_columns', None)
pandas.set_option('display.max_rows', None)
# 行列获取
print("获取df1行列总数 {}".format(df1.shape)) # 获取df行列总数 返回(5, 5)
print("获取df1总行数 {}".format(df1.shape[0])) # 取行数
print("获取df1第1行数据 {}".format(df1.loc[0])) # df.loc[index] 根据索引获取单行数据
print("获取df1前3行数据 {}".format(df1.loc[0: 2])) # 选取在此索引范围内的多行数据
print("获取df1前3行数据 {}".format(df1.head(3))) # 看前3行的数据,默认为5
print("获取df1后3行数据 {}".format(df1.tail(3))) # 看最后3行的数据,默认为5
print("按照0.5比例随机获取df行数据 {}".format(df1.sample(frac=0.5))) # 按照0.5比例随机抽取数据
print("获取df1第1行和第3行数据 {}".format(df1.loc[[0, 2]])) # df.loc[[index1,index2,......]] 根据索引获取多行数据
print("获取df1第2列至第4列所有行数据 {}".format(df1.iloc[:, 1:4])) # 获取 1-3索引所有行记录
print("获取df1总列数 {}".format(df1.shape[1])) # 取列数
print("获取df1列名 {}".format(df1.columns)) # 获取列名 返回列表
print("获取df1下单量列所有数据 {}".format(df1["下单量"])) # 获取指定列数据 df[“列名”]获取列数据
print("获取df1下单量和商品价格列数据 {}".format(df1[["下单量", "商品价格"]])) # df[[“列名1”,"列名2",...]获取多列数据
print("获取df1商品链接列数据并保存为list {}".format(df1["商品链接"].values)) # 指定列的数据保存为list way1
print("获取df1下单量列数据并保存为list {}".format(df1["下单量"].values.tolist())) # 指定列的数据保存为list way2
# 行列新增
df1.loc["新增1行"] = ["https://mp.weixin.qq.com/s/Rh-9Bi274223BCXGdXMBbZw", 100, 0.1, 10, None] # 增加行 way1
df1.at["再次新增1行"] = ["https://mp.weixin.qq.com/s/Rh-9Bi232232BCXGdXMBbZw", 200, 0.2, 20, None] # 增加行 way2
print("df1新增2行数据 {}".format(df1))
s = pandas.Series(["https://mp.weixin.qq.com/s/Rh-9BiMD662BCXGdXMBbZw", 700, 0.2, 20, None], index=df1.columns, name='5') # 增加行 way3
df_add_row = df1.append(s)
print("df1末尾新增1行数据,index自动增长 {}".format(df_add_row))
df1_add_column = pandas.concat([df1, pandas.DataFrame(columns=list('d'))]) # 增加列 way1 # 末尾添加一列 列只能是abcd
print("df1新增1列,列名为d,d列值为NaN {}".format(df1_add_column))
df1['column1'] = 1 # 增加列 way2
print("df1再次新增1列,列名为column1,column1列值为1 {}".format(df1))
df1.insert(1, 'column2', 2, allow_duplicates=False) # 增加列 way3 #df.insert(添加列位置索引序号,添加列名,数值,是否允许列名重复)
print("df1指定位置添加1列,列名为column2,column2列值为2 {}".format(df1))
# 数据统计
print("统计df1值为数字类型列count mean std min 25% 50% 75% max {}".format(df1.describe())) # 只会对数字类型的列有效 对每一列是数字类型的数据进行统计 返回count mean std min 25% 50% 75% max
print("统计df1商品单价最大值 {}".format(df1["商品单价"].max()))
print("统计df1商品单价最小值 {}".format(df1["商品单价"].min()))
print("统计df1商品单价标准差 {}".format(df1["商品单价"].std()))
print("统计df1下单笔数 {}".format(df1["商品单价"].count()))
print("统计df1商品单价中位数 {}".format(df1["商品单价"].median())) #
print("统计df1商品单价25%分位数 {}".format(df1["商品单价"].quantile()))
print("统计df1商品单价平均值 {}".format(df1['商品单价'].mean())) # 求一整列的均值,返回numpy
print("统计df1商品单价列,商品价格列平均值 {}".format(df1[['商品单价', '商品价格']].mean())) # 求多列的均值
print("统计df1每条商品链接的出现次数 {}".format(df1["商品链接"].value_counts())) # 统计每条商品链接的出现次数
print("统计每个时间段的下单量总计 {}".format((df1.groupby(by=['下单时间']).sum())['下单量'])) # 统计每个时间段的下单量总计 sum()函数
print("获取每个商品链接的总计下单量 {}".format(df1.groupby('商品链接')['下单量'].agg('sum'))) # 获取每个商品链接的总计下单量 agg聚合
print("按照下单时间聚合下单量小于4000的订单笔数 {}".format((df1.loc[df1["下单量"] < 4000]).groupby(by=['下单时间']).count())) # 按照下单时间聚合下单量小于4000的订单笔数 count()获取次数 多个运算条件注意括号 单条件
print("按照下单时间聚合下单量小于2000并且大于等于500的订单笔数 {}".format((df1.loc[(df1['下单量'] >= 500) & (df1['下单量'] < 2000)].groupby(by=['下单时间']).count()))) # 如上 多查询条件
# 空值(None)操作
print("输出df1列是否含None值 {}".format(df1.notnull())) # 判断是否为空值(None),反向函数为isnull()
print("输出df1商品价格列不为空的行 {}".format(df1[df1['商品价格'].notnull()])) # 将'商品价格'列不为空的行输出
print("删除df1有None值的行 {}".format(df1.dropna(how='any'))) # 将带有空值(None)的行删除。how='any'意味着,该行中只要有一个空值,就会删除,可以改成all。
df1['商品价格'].fillna(value=df1['下单量'], inplace=True) # 直接将缺失值赋值其他列的数据 fillna(value=被替换的数据)
print("更新df1商品价格列为None的数据为下单量值".format(df1))
print("删除df1商品价格和商品单价任意列含None的行 {}".format(df1.dropna(subset=['商品价格', '商品单价'], how='any'))) # subset参数指定在特定的列中判断空值。 all代表全部为空,才会删除该行;any只要一个为空,就删除该行。
# 数据排序
print("按照下单量升序显示df1数据 {}".format(df1.sort_values(by=['下单量'], ascending=1))) # 按照下单量升序显示数据,acsending:1升序,0降序
print("按照下单量,商品单价升序显示df1数据 {}".format(df1.sort_values(by=['下单量', '商品单价'], ascending=[1, 1]))) # 按照多列进行排序
# 行列转换
print("df1行列转换 {}".format(df1.T))
# 数据去重
link_distinct = df1.drop_duplicates(subset=['商品链接'], keep=False) #去除重复的商品链接 keep:重复数据保留配置 keep: Literal["first"] | Literal["last"] | Literal[False] = "first",
print("去除df1重复的商品链接 {}".format(link_distinct))
# 集合获取
print("获取df1与df2的差集 {}".format(df1[~df1['商品链接'].isin(df2["商品链接"].values.tolist())])) # 获取df1与df2的差集
print("获取df2与df1指定列的交集数据 {}".format(df2[df2['商品链接'].isin(df1["商品链接"].values)])) # 获取df2与df1指定列的交集数据
# 行列编辑 (编辑,删除)
df1['下单量'] = df1['下单量'].replace(3600, 5600) # 将指定列(下单量)的3600修改为5600 way1
print("更新df1下单量列值=3600的值为5600 {}".format(df1))
df1['下单量'].loc[df1['下单量'] < 2000] = 2500
print("更新df1下单量列值<2000的值为2500 {}".format(df1))
del df1['商品链接'] # 删除指定列 way1
print("删除df1商品链接列 {}".format(df1))
df1.drop(['下单量'], axis=1, inplace=True) # 删除指定列 way2
print("删除df1下单量列 {}".format(df1))
df1.drop(df1.index[0], inplace=True) # 删除第1行
print("删除df1第1行数据 {}".format(df1))
df1.drop(df1.index[0:2], inplace=True) # 删除前2行
print("删除df1前2行数据 {}".format(df1))
df1.drop(df1.index[[0, 1]], inplace=True) # 删除第1第2行
print("删除df1第1行和第2行数据 {}".format(df1))