1.对DataFram进行合并操作
data = pd.merge(df1,df2,left_on = "名称",right_on = " 姓名") #对数据进行左右合并
data = pd.concat([df1,df2,df3,df4],axis = 0) #对数据进行上下合并
df_inner=pd.merge(df,df1,how='inner')
df_left=pd.merge(df,df1,how='left')
df_right=pd.merge(df,df1,how='right')
df_outer=pd.merge(df,df1,how='outer')
2.在字段中对数据进行模糊匹配,相当于excel中的关键字查找
筛选出姓名列中包含"张"的数据:
data = df[df["姓名"].str.contains(r'.*?张.*')]
data = df[df["姓名"].isin(["张"])]
data = df[~df["姓名"].isin(["张"])] #通过~取反,筛选出姓名列中不包含"张"的数据
3.将"地址"字段所有数据保留前5个字符(注意:前闭后开)
df[" 地址"] = df["地址"].str[0:5]
4.将[{'a':'int','b':'str'},{'a':'cat','b':'dog'}]变成datafram
df = pd.DataFrame(newlist)
5.将dataframe写到表格中,可以保存为csv和xlsx格式(注意:encoding在中文显示乱码的情况下要修改编码格式)
pandas往csv里写文件时0丢失的问题:在字符串前面加上"\t"就能正常作为文本写入csv
data[代码] = "\t" + data[代码] #可以保留代码前的0
df.to_csv('data.csv',encoding = 'utf-8-sig',index = None) #不要行号
df.to_csv('data.csv',encoding = 'utf-8-sig') #要行号
df.to_excel('data.xlsx',encoding = 'utf-8')
6.删除姓名列中含有空值的那一行
df1 = df1[df1["姓名"].notna()] #删除None所在的行
df1 = df1.dropna()
df1 = df1.dropna(axis = 0,how = 'all') #删除整行都是空的
df1 = df1.fillna(" ") #把空值填成字符串
7.更改列名及更改列字段的值
df1.rename(columns = {"name":"姓名","id":"序号"},inplace = True)
data['是否在职'] = data['是否在职'].replace('1','在职')
data['是否在职'] = data['是否在职'].replace('0','离职')
用判断语句进行修改,1为在职0为离职,因为序列中的多个值不能和单个值比较,所以定义一个变量a
def zhiwei(a):
if (a == '1'):
return ' 在职'
else:
return ' 离职'
data['是否在职'] = data['是否在职'].apply(zhiwei)
8.删除数据
df1.drop(df[["姓名","地址"]],axis = 1,inplace = True) #删除某几列
df1 = df1.drop_duplicates() #删除重复的行
#按列位置删除一列或多列
sql_data.drop(sql_data.columns[[0,1]],axis=1,inplace=True)
df_pledgee = df2[df2['p_stock2220_F006N'].notna()]
# 删除None所在的 行
df= df.dropna()
#删除重复的某行保留第一条
df = df.drop_duplicates(subset=['fund_id'],keep='first',inplace=True)
9.用groupby做分组运算(注:按“姓名”进行分类,将同一组的“次数”求和)
df1 = df1[[" 次数"]].grouby(df1["姓名"]).sum()
df1 = df1.groupby(["姓名","地址","次数"]).sum()
df1 = df1.reset_index() #把索引变成列名
df1 = df1.sort_values(by = "次数",ascending = True) #排序
#筛选每组中最大的
df.groupby('fund_code').apply(lambda t: t[t.market_date==t.market_date.max()])
#groupby后保留原来的列
df_company = df[['customerId']].groupby(df['companyCode']).count().reset_index()
df_data.groupby(['FirstIndustryName'])['price_limit'].mean().reset_index()
df.groupby(['fund_code', 'market_date', 'subject_id']).sum()['market_value'].reset_index()
#分组移动求某一时间段的最大值
data_base['quotationLocal_max'] = data_base.groupby(['subjectName', 'companyCode', 'fundCode'])['quotationLocal'].cummax()
#分组滚动求值
fund_data['stock_sale_earn'] = fund_data.groupby(['companyCode', 'fundCode', 'subjectCode']).apply(
lambda x: (x['number'].shift(1) - x['number']).map(lambda x: x if x > 0 else 0) * (
x['quotation'] - x['quotation'].shift(1))).values
10.多列合并及拆分
df1["信息"] = df1[["姓名","地址"]].apply(lambda x:'/'.join(x),axis = 1)
df1["姓名"] = df1["信息"].map(lambda x:x.split('/')[0])
df1["地址"] = df1["信息"].map(lambda x:x.split('/')[1])
拆分字符串(rsplit从后往前)
df1["信息"] = df1["信息"].str.rsplit('',1)
#对category字段的值依次进行分列,并创建数据表,索引值为df_inner的索引列,列名称为category和size
pd.DataFrame((x.split('-') for x in df_inner['category']),index=d
f_inner.index,columns=['category','size'])
11.条件筛选(时间)
df1 = df1[(df1['data'] >= start_day) &
(df1['data'] <= end_day) &
(df1['seccode'] == seccode) ]['df1num']
12.处理缺失值
def remove_the_null(data,data1,a): #第二个参数:当缺失率达到多少时,直接删除
t = []
for col_name in data.columns:
changdu = len(data[col_name])
cnt = list(data[col_name].isna()).count(True)
if (cnt / changdu > a):
del data[col_name]
del data1[col_name]
t.append(col_name)
return data,data1,t
df.fillna(value = 0) #使用0对NA进行填充
df['price'].fillna(df['price'].mean()) #使用price均值对NA进行填充
df.isnull() #检查数据空值
df['price'].isnull() #检查特定列空值
13.Series取成一个值
df1 = df1.iloc[0]
df_inner.iloc[:3,:2] #使用iloc按位置区域提取数据
df_inner.iloc[[0,2,5],[4,5]] #使用iloc按位置单独提取数据
14.dataframe转置
df1 = pd.DataFrame(df.values.T, index = df.columns, columns = df.index)
15.将DataFrame类型的数据按某一列的值拆分成多个DataFrame类型的数据
class = data["地址"].unique()
for i in class:
data = data[data["地址"].isin([class])]
16.利用数据框df的name列中的非空值去填充df的features列中对应的NaN
df.loc[df['features'].isnull(),'features'] = df[df['features'].isnull()]['name']
csv_data = csv_data.fillna(' ') #把空值填成空字符串
17.转变数据类型astype
df['代码'] = df['代码'].astype(str)
df['代码'] = df['代码'].astype(str).str[0:10].str.replace('-','.') #转化类型、截取字段、替换数据
18.读数据
cavPath1 = 'excel_name.xlsx'
excel_name = pd.read_excel(cavPath1,encoding = 'utf-8-sig',converters={u'代码':str}) #可以把以0开头的字段转为字符串
19.把list中每个元素加1
l = map(lambda n:n+1,l)
20.pandas DataFrame取列名
DataFrame.columns.values.tolist()
21.给数据前面补0
s = n.zfill(5) #用来给字符串补0
s = "%05d" % n #纯数字,我们也可以通过格式化的方式来补0
22.过滤掉非int的数
if isinstance(days,int):
if days < 32:
return f'离{product}付息日 ({timeData})还差{days}天'
else:
return ' '
else:
return ' '
23.转成json文件
class MyEncoder(json.JSONEncoder):
def default(self,obj):
if isinstance(obj,numpy.integer):
return int(obj)
elif isinstance(obj,numpy.floating):
return float(obj)
elif isinstance(obj,numpy.ndarray):
return obj.tolist()
else:
return super(MyEncoder,self).default(obj)
filename = 'data.json'
with open(filename,'w') as f:
json.dump(ret,f,cls = MyEncoder,ensure_ascii = False)
24.对数据进行替换
df["TermIndex"] = df["TermIndex"].raplace([1,2],['一','二']) #替换"TermIndex"的值,将数字转为中文
translations = {r'(.*)<(.*)' : r'\l<\2' , r'(.*)>(.*) : r'\l>\2'}
df = df.replace(translations,regex = True) #替换某个字符:数据值中含有<>的使用(只替换最后出现的那个)
data = data.replace('[<]','<',regex = True) #替换某个字符:数据值中含有<>的使用(替换所有出现的)
data = data.replace('[>]','>',regex = True)
25.合并多个表格到一个sheet中,startcol从第几列开始拼接,startrow第几行开始拼接
df1 = data()
df2 = data()
df3 = data()
writer = pd.ExcelWriter('汇总表.xlsx')
df1.to_excel(writer)
df2.to_excel(writer,startcol = 4)
df1.to_excel(writer,startcol = 8,startrow = 4)
writer.save()
26.对日期的处理
time1['起始日'] = pd.to_datatime(time1['起始日'],format = "%Y-%m -%d") #转换为日期形式
time1['起始日'] += datatime.timedelta(days = 1) #日期天数加1
rightTime = pd.datetime.now() - dateutil.relativedelta.relativedalta(months=6) #从今天开始往前推半年
27.数据表检查
df.shape #数据维度(行列):Excel中可以通过CTRL+向下的光标键,和CTRL+向右的光标键
df.info() #数据表信息:数据维度、列名称、数据格式和所占空间等信息
df.dtypes #查看数据表各列格式
df['B'].dtype #查看单列格式
df.values #查看数据表的值
df['name'].unique #查看name中的唯一值
df.columns #查看列名称
df.head() #查看前10行
df.tail() #查看最后10行
28.数据清洗
df['city']=df['city'].map(str.strip) #清除city字段中的字符空格
df['city']=df['city'].str.lower() #city列大小写转换
df['price'].astype('int') #更改数据格式
df.rename(columns = {"name":"姓名","id":"序号"},inplace = True) #更改列名称
df['city'].drop_duplicates() #删除后出现的重复值
df['city'].drop_duplicates(keep='last') #删除先出现的重复值
df['city'].replace('sh', 'shanghai') #数据替换
df = df.sort_values(by="日期",ascending=True) #按某列的值排序
df['a'] = df['mean'].round(decimals=2) #保留两位小数
df['a'] = df['mean'].map(lambda x:("%.2f)%x) #不为数值型字段
df['a'] = df['mean'].map(lambda x:format(x,".2%))
df['a'] = df['mean'].apply(lambda x:round(x,2))
29.数据预处理
df_inner=pd.merge(df,df1,how='inner') #数据表匹配合并,合并的方式还有left,right和outer方式
df_inner.set_index('id') #设置索引列
df_inner.sort_values(by=['age']) #按特定列的值排序
df_inner.sort_index() #按索引列排序
df_inner['group'] = np.where(df_inner['price'] > 3000,'high','low
') #使用Where函数用来对数据进行判断和分组
df_inner.loc[(df_inner['city'] == 'beijing') & (df_inner['price']
>= 4000), 'sign']=1 #对复合多个条件的数据进行分组标记
30.数据提取
df_inner.loc[3] #按索引提取单行的数值
df_inner.loc[0:5] #按索引提取区域行数值
df_inner.reset_index() #重设索引
df_inner=df_inner.set_index('date') #设置日期为索引
31.数据筛选
#使用“与”条件进行筛选
df_inner.loc[(df_inner['age'] > 25) & (df_inner['city'] == 'beiji
ng'), ['id','city','age','category','gender']]
#使用“或”条件筛选
df_inner.loc[(df_inner['age'] > 25) | (df_inner['city'] == 'beiji
ng'), ['id','city','age','category','gender']].sort(['age'])
#使用“非”条件进行筛选
df_inner.loc[(df_inner['city'] != 'beijing'), ['id','city','age',
'category','gender']].sort(['id'])
#对筛选后的数据按city列进行计数
df_inner.loc[(df_inner['city'] != 'beijing'), ['id','city','age',
'category','gender']].sort(['id']).city.count()
#使用query函数进行筛选
df_inner.query('city == ["beijing", "shanghai"]')
#对筛选后的结果按price进行求和
df_inner.query('city == ["beijing", "shanghai"]').price.sum()
32.数据汇总
df_inner.groupby('city').count() #对所有列进行计数汇总
df_inner.groupby('city')['id'].count() #对特定的ID列进行计数汇总
df_inner.groupby(['city','size'])['id'].count()#对两个字段进行汇总计数
#对city字段进行汇总并计算price的合计和均值。
df_inner.groupby('city')['price'].agg([len,np.sum, np.mean])
33.Python中通过pivot_table函数实现数据透视
#设定city为行字段,size为列字段,price为值字段。分别计算price的数量和金额并且按行与列进行汇总。
pd.pivot_table(df_inner,index=["city"],values=["price"],columns=[
"size"],aggfunc=[len,np.sum],fill_value=0,margins=True)

34.数据采样
df_inner.sample(n=3) #简单的数据采样
weights = [0, 0, 0, 0, 0.5, 0.5] #手动设置采样权重
df_inner.sample(n=2, weights=weights)
df_inner.sample(n=6, replace=False) #采样后不放回
df_inner.sample(n=6, replace=True) #采样后放回
df_inner.describe().round(2).T #数据表描述性统计
df_inner['price'].corr(df_inner['m-point']) #相关性分析
df_inner.corr() #数据表相关性分析

35.时间与今天对比
把数据表中给出的时间与今天对比,划分一个时间范围用0和1来判断取值
today = pd.datetime.now()
def dfApply01(d):
d = datetime.datetime.strptime(d,"%Y-%m-%d") #
theDay = today + dateutil.relativedelta.relativedelta(days=7)
#time1['起始日'] += datatime.timedelta(days = 1)
if d <=theDay and d>today:
return 1
else:
return 0
dataAll["bool"] = dataAll["最迟时间"].apply(dfApply01)
36.遍历每一个值来读取
def mainStar(data):
report = data["日期"]
seccode = data["代码"]
secname = data["简称"]
year = data["年度"]
year01 = int(year)+1
if report == "年报":
message = f'根据提交的{report}披露时间,{seccode}{secname}需要在{year01}发送报告'
else:
message = " "
return message
df["notice"] = df.apply(mainStar,axis=1)
37.引用模块
import sys, os
base_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #os.path.dirname比文件夹个数多1
sys.path.append(base_path)
from test3 import c
38.数值设置千分位、保留小数点
data["数量"] = data["数量"].map(lambda x:format(x,",")) #设置千分位
data["数量"] = data["数量"].round(decimals = 2)
data["数量"] = data["数量"].map(lambda x:("%.2f")%x)
data["数量"] = data["数量"].map(lambda x:format(x,".2%"))
data["数量"] = data["数量"].apply(lambda x:round(x,2))
39.合并两个字典
from collections import ChainMap
context = dict(ChainMap(data_dic,pic_dic))
40.取出A与B之间的数据
data["max"] = data["tag"].apply(lambda x:(x.partition("A")[2].partition("B"))[0][:])
41.读取json
import json
with open("1.json","r",encoding = "utf-8") as f:
content = json.load(f)
print(content)
42.创建excel表格
import numpy as np
import pandas as pd
import openpyxl
data = np.random.randint(10,40,size=(20,4))
columns = ["a","b","c","d"]
df = pd.DataFrame(data = data,columns = columns)
df.to_excel("df.xlsx",encoding="utf-8-sig",index=None)
print(df)
43.忽略警告错误信息
import warnings
warnings.filterwarnings('ignore')
网友评论