pandas 操作

----------pandas 1----------
series1=pd.Series([2.5,21,2.3,56,41])  #创建序列,一维
series1=pd.Series([2.5,21,2.3,56,41],index=list('abcde'),name='This is datas') 
series2=pd.Series(np.random.randint(-5,1,size=10),index=np.arange(1,11))
series3=pd.Series({'北京':2.5,'上海':3.33,'广东':1.2,'江苏':0.2}) #字典,键是索引
series4=pd.Series([2.5,3.33,1.2,0.2],index=['北京','上海','广东','江苏'])
series4.values  #返回 序列
series4.index   #返回 索引
series4.index.values
series4.dtype  #返回   类型
series4.ndim  #返回   维度
series4[1:]  #下标索引访问 ,左闭右开
series4['广东']  #  标签访问
series4['广东':'江苏'] #左闭右闭
series4=series4.append(series5)        #追加
del series4['四川']  # 删除
series4.drop('重庆')  #删除, 但原数据不变
series4.drop('重庆',inplace=True)  #删除, 原数据改变

---------pandas 2-----------
list1=[['张三',12,'男'],['李四',25,'男'],['李月',22,'女']]
df=pd.DataFrame(list1,index=np.arange(1,4),columns=['姓名','年龄','性别'])
df.values
df.index[1]
df2=pd.DataFrame({'姓名':['张三','李四','李月'],'年龄':[12,22,33],'性别':['男','男','女']})
df2=pd.DataFrame({'姓名':['张三','李四','李月'],'年龄':[12,22,33],'性别':['男','男','女']},index=[1,2,3],skipinitialspace=True)
arr1=np.array(list1)
df3=pd.DataFrame(arr1,columns=['姓名','年龄','性别'],index=[1,2,3])
df3.shape
df3.ndim
df3.dtypes
df3.columns
df3.columns.tolist()
df3.size
df3.indexdf3.index.tolist()
df3.index.tolist()

---------pandas 3--------
df=pd.read_csv(r'E:\数据分析\data\demo4.csv')
os.chdir(r'E:\数据分析\data')
df=pd.read_csv(r'demo4.csv')
df.head()   #默认前五行
df.head(1)   #前一行
df.tail()   #默认后五行
df.tail(2) #后两行
df.dtypes  #每一列的数据类型
df=pd.read_csv(r'E:\数据分析\data\demo4.csv',dtype={'id':str})  #读取类型
df=pd.read_csv(r'E:\数据分析\data\demo4.csv',dtype={'id':str},nrows=2)  #读取前两行
df=pd.read_csv(r'E:\数据分析\data\demo4.csv',dtype={'id':str},nrows=2,sep=',')  #分隔符 ,
df=pd.read_csv(r'E:\数据分析\data\demo4.csv',na_values=[1,5])  #设置1,5为缺失值,即空值,只要出现1或5,就换为空值NaN
df=pd.read_excel('订单汇总1.xlsx',sheet_name='南京惠通创意展示',
                dtype={"'订单编号":str})
sheet_name=['meal_detail'+str(i) for i in range(1,4)]
data_all=pd.DataFrame()
for i in [3,5]:
    data=pd.read_excel('订单汇总1.xlsx',sheet_name=i,header=1)
    data_all=pd.concat([data_all,data])
df=pd.read_excel('订单汇总1.xlsx',sheet_name=[3,5])
data_all.to_excel('data_all.xlsx',index=False,encoding='gbk') #不要索引
data_all.to_csv('data_all.csv',index=False,encoding='utf-8') #不要索引

--------pandas 4---------
data[1:11]
data.订单编号.head(5)
data['订单编号'].head(5)
data[['日期','订单编号']][2:3]
data[2:3][['日期','订单编号']]  #下标,列名
data.loc[2,'日期']
data.loc[2:5,['日期','订单编号']] #标签
data.loc[2:5,'订单编号':'日期']
data.loc[[1,3,9],['日期','订单编号']] #标签
data.loc[data['日期']=='2014-10-16',['日期','订单编号']] #判断
data.iloc[:,0:3]  #列名按下标

#loc可以用于添加元素,而iloc不能,会超出索引范围

data.iloc[0:2,0:3]  #按下标
data.iloc[[1,5],[1,3]]
data.iloc[1,[1,3]][1]
data.iloc[1,[1,3]]['存货名称']
data.loc[2:4] #按标签,可以理解为左闭右闭
data.iloc[2:4] #按下标,和标签没有关系,下标从0开始,可以理解过左闭右开

---------pandas 5---------
import pymysql   #用于数据库连接
from sqlalchemy import create_engine  
conn=pymysql.connect(host='localhost',user='root',passwd='wzb19980316',port=3306,db='wzb')
cursor=conn.cursor()

sql='''
  create table if not exists meal(
      编号 int primary key,
       交易时间 date not null,
       种类  varchar(12) not null,
       单价  int not null,
       成交量  int not null,
       总额  int not null
  )
'''
cursor.execute(sql)

sql='insert into meal values (%s,%s,%s,%s,%s,%s)'
list1=[(3,'2998/3/6','苹果',1,2,2),
       (4,'3999/4/25','香蕉',4,5,20)]
cursor.executemany(sql,list1)

conn.commit()  #提交,更新
cursor.close()
conn.close()
create_engine('mysql+pymysql://user:password@IP:3306/database_name')
#建立连接
conn=create_engine('mysql+pymysql://root:wzb19980316@localhost:3306/wzb')  #数据库+数据库连接
sql='select * from meal'
data=pd.read_sql(sql,conn)

 # if_exists   replace 替换 ,  append 追加 ,  fail 失败,啥都不干
    # index   True 索引也写进去 ,False 但一般不写索引
    df.to_sql('testdf',con=conn,index=False,if_exists='replace')

---------pandas 6----------
df[df['订单编号']=='0000000636'][['订单编号','日期']]
df[['订单编号','规格型号']]
df[['订单编号','规格型号']][(df['订单编号']=="0000008638") & \
                    (df['规格型号']=="575*1775mm")]
                    (df['规格型号']=="575*1775mm")]
df[['订单编号','规格型号']][(df['订单编号']=="0000008638") | \
                    (df['规格型号']=="575*1775mm")]
df[['订单编号','规格型号']][(df['订单编号']=="0000008638") & ~(df['规格型号']=="575*1775mm")]
df['合计']
df['合计'][df['合计'].between(144,297)]   #左闭右闭
df['合计'][df['合计'].between(144,297,inclusive=True)]     #左闭右闭
df['合计'][df['合计'].between(144,297,inclusive=False)]     #左开右开
df['单位'][df['单位'].isin(['套','张'])]
df[['订单编号','单位']][df['单位'].isin(['套','张'])]
df['存货名称'].str.contains('华润漆合作伙伴')[:-1]   #包含某个子串
df['再次合计']=df['数量']  *  df['合计']
df['你猜啊']='shitou'
df=df.drop(['你猜啊','再次合计'],axis=1) # 沿横轴搜索,即删除某列  inplace=True作用到原数据
df.drop(['存货编号'],axis=1,inplace=True)
mid=df['存货编号']
df.insert(0,'存货编号',mid) #插入  参数: 位置, 列名,列值
df.drop(labels=[3,4],axis=0,inplace=True)
li=df[5:6]
df.append(li)
df.loc[df['含税单价']==612.4,'含税单价']=800
df.loc[df['含税单价']==800,'含税单价']
df.rename(columns={'合计':'total','数量':'num','含税单价':'price'}) #重命名,列名
df.rename(columns={'合计':'total','数量':'num','含税单价':'price'},inplace=True)
df.rename(index={0:1000},inplace=True) #重命名,行索引
df.describe()  #统计分析
df.describe().loc['count']  #统计分析

-----------pandas 7-----------
order=pd.read_excel('订单汇总1.xlsx',header=0,sheet_name=1,
                   index_col=[0,2]) #index_col第几列作为行索引 header第几行作为表头
order.loc[('0000000867/865','B032010158'),:]  #多重索引,参数必须是元组格式
order.loc['0000000867/865'].loc['B032010158']
order.loc[('0000000867/865',['B032010158','B032010157']),:]
order.loc[('0000000867/865',['B032010158','B032010157']),'日期':'单位']
order.loc[('0000000867/865',['B032010158','B032010157']),['单位','合计']]

-----------pandas 8------------
data.dtypes
data.columns
data.index
data.isnull()  #判断是否为空值
np.sum(data.isnull(),axis=0)
data.sort_values('clump_thickness',ascending=False)    #按某列排序,是否升序
data.sort_values('clump_thickness',ascending=False,
                 na_position='last',inplace=True) #空值或缺失值 排到最后
data.sort_values('clump_thickness',ascending=False,
                 na_position='first',inplace=True) #空值排最前
data.reset_index(inplace=True,drop=True) #丢掉之前的索引,重置
data.sort_values(['size_uniformity','shape_uniformity'])
#先按第一个排序,再按第二个排序

------------pandas 9----------
np.min(data[column_names],axis=0)
np.median(data[column_names],axis=0)
np.min(data.loc[:,'Length':'Rings'],axis=0)
np.max(data.loc[:,'Length':'Rings'],axis=0)
data.loc[:,'Length':'Rings'].max(axis=0)
data.loc[:,'Length':'Rings'].cumsum()  #累计求和
data.loc[:,'Length':'Rings'].sum()
data.loc[:,'Length':'Rings'].quantile(0.5)  #百分比,占升序序列中的位置,0.5是中位数
data.loc[:,'Length':'Rings'].median()
data.loc[:,'Length':'Rings'].quantile([0,0.1,0.5,0.8,1])
data.loc[:,'Length':'Rings'].mean()
data.loc[:,'Length':'Rings'].describe().loc['mean']
data.describe(include=['object'])
#cout 多少 ,  unique 不重复个数 , top 次数最多的 , freq 次数最多的
#对应频率
data.describe(include=['object','float'])
gb1=data.groupby('class')  #分组
gb1.describe()
gb1.size()
gb1.cumcount() #对同属于一个样本的数据进行编号
gb2=data[names].groupby(by=['bare_nucleoli','class'])
gb2.describe().loc[('1',4),:]
gb2.mean().loc[(['1','10'],4),:]
gb2.mean().loc[(['1','10'],4),'normal_nucleoli':'mitoses']

---------pandas 10-------------
grouped=data[names].groupby('class')
grouped.agg([np.mean,np.sum])    #聚合
grouped.agg([np.mean,np.sum]).loc[[2],'bland_chromatin']
grouped.agg([np.mean,np.sum]).loc[[2],('bland_chromatin','sum')]
grouped.agg([np.mean,np.sum]).loc[[2],('bland_chromatin',['mean','sum'])]
grouped.agg({'bland_chromatin':'mean','normal_nucleoli':'sum'})
grouped.agg({'bland_chromatin':np.mean,'normal_nucleoli':np.sum})
grouped.agg({'bland_chromatin':[np.mean,np.median,
                               np.sum],'normal_nucleoli':np.sum})
#自定义函数
def DoubleSum(data):
    s=data.sum()*2
    return s
grouped.agg({'bland_chromatin':DoubleSum}) #也可写入函数
def divideT(data):
    return data.sum()/2
grouped.agg({'bland_chromatin':[divideT,np.sum]})
grouped.apply(np.sum,axis=0) #效果差不多,但有所区别
data.apply(np.sum,axis=0)
data[names].apply(lambda x: x[2] - x[1],axis=1)
grouped.mean().transform(lambda x:x*2)
grouped.mean().apply(lambda x:x*2)

-----------pandas 11----------------
pd.pivot_table(data,index,columns,value,aggfunc,fill_value,margins,
            margins_name=)
index:  行分组键
columns:  列分组键
values:   分组的字段,只能为数值型变量
aggfunc:   聚合函数--mean,min,,,,
fill_value: 用什么值替换缺失值
margins:  是否需要总计
pd.pivot_table(data=df,index='id',columns='shape_uniformity',
               values='size_uniformity',fill_value=0,
              aggfunc=np.mean,margins=True,
              margins_name='总计求')
pd.pivot_table(data=df,index='id',columns='shape_uniformity',
               values=['size_uniformity'],fill_value=0,
              aggfunc=[np.mean,np.sum],margins=True,
              margins_name='总计求')
pt.loc[[61634,1371026],('mean',['bland_chromatin','size_uniformity'])]
pt.loc[[61634,1371026],(['mean','sum'],['bland_chromatin','size_uniformity'])]
pd.crosstab(index=df['id'],columns=df['bare_nucleoli'],margins=True)
pd.crosstab(index=df['id'],columns=df['bare_nucleoli'],
            values=df['shape_uniformity'],aggfunc=np.sum,margins=True)
pd.crosstab(index=df['id'],columns=df['bare_nucleoli'],
            normalize='all',margins=True)
# 计算总百分比,即 某个元素值除以所有行所有元素的总值all
# 比如 1 /  699
pd.crosstab(index=df['id'],columns=df['bare_nucleoli'],
            normalize='index',margins=True)
# 计算行百分比,即 某个元素值除以当前行所有元素的总值all
# 比如   1 /  1
pd.crosstab(index=df['id'],columns=df['bare_nucleoli'],
            normalize='columns',margins=True)
# 计算列百分比,即 某个元素值除以当前列所有元素的总值all
#比如 1 /  402

--------------pandas 12------------
pd.to_datetime(data['日期'],format='%Y-%m-%d',
               errors='coerce') #error若不是 对应格式%Y-%m-%d,则按空值处理
data1['客户名称'].str[:-1]
data1['客户名称'].value_counts() #每一种值出现的次数
data1.describe(include='all')
pd.datetime.today()  #时间
data1['订单时间']=pd.datetime.today().microsecond - data1['订单时间']  #时间戳相减
data['日期'] / np.timedelta64(1,'D')
# D 是转换为天数
# 而 除以 1 则是按天算 ,即 一天一周期
# 除以  7 则是按周算,即 七天一周期
# 除以 30 则是按月算,即  一月一周期
data['日期'] / np.timedelta64(7,'D')
(data['日期'] / np.timedelta64(1,'D'))[:-1].astype(int)

-------------pandas 13--------------
pd.read_excel('订单汇总1.xlsx',sheet_name=2,nrows=11)
df1=df1.append(df1)
df1.duplicated()  #查重,是否是重复记录
df1.duplicated(subset=['客户名称']) #根据指定的列查重
df1.duplicated(subset=['客户名称'],keep='first') #保留第一个值 
df1.duplicated(subset=['客户名称'],keep='last') #保留最后一个
df1.drop_duplicates()   #删除重复的
df1.drop_duplicates(subset=['客户名称'],inplace=True) #删除指定列重复的

-------------pandas 14----------
df.isna() / df.isnull()     #是否为缺失值,即空值
df.apply(lambda x: sum(x.isnull()) / len(x),axis=0) #每一列的缺失率
df.dropna() #只要一行当中有一个值是空值,整行就会被删除
df.dropna(axis=1) #只要一列当中有一个值是空值,整列就会被删除
df.dropna(how='any',axis=0)  #any只要一行有一个空值,就会删除
df.dropna(how='all',axis=0)  #只有一行全部为空值,才会删除
df.dropna(subset=['序号'],how='any')  #一行中指定的列,出现一个空值,就删除
df.dropna(subset=['序号'],how='all')  #一行中指定的列,全部为空值,才删除
df2.fillna(0)
df2['宽(cm)'].fillna(df2['宽(cm)'].mean(),inplace=True)
df.画面内容.mode()   #众数,即出现次数最多的种类,而众数可能不止一个
df2.画面内容.fillna(df.画面内容.mode()[0])
df.fillna(value={'画面内容':df['画面内容'].mode()[0],
                '高(cm)':df['高(cm)'].median()})
df.fillna(method='ffill') #空值会用前一行的当前列填充  前项填充
df.fillna(method='bfill') #空值会用后一行的当前列填充 后项填充
df.interpolate(method='linear') #线性插值填充空值  比如 上边是70,下边是80,则空值用75填充
df['宽(cm)'].interpolate(method='polynomial',order=1)   #多项式填充,order=1,一次多项式

-----------pandas 15------------
xbar=df.WholeWeight.mean()
xstd=df.WholeWeight.std()
any(df.WholeWeight> xbar + 2 * xstd) #有一个为True ,则为True
df.WholeWeight.plot(kind='bar')
df.WholeWeight.plot(kind='hist')
df[:][(df.WholeWeight<= xbar + 2 * xstd) & 
      (df.WholeWeight>= xbar - 2 * xstd)]
Q1=df.WholeWeight.quantile(q=0.25) #下四分位数
Q3=df.WholeWeight.quantile(q=0.75) #上四分位数
IQR=Q3-Q1 #分位差
Q3 + 1.5 * IQR
Q3 - 1.5 * IQR
df.WholeWeight.plot(kind='box')  #分位图
df[(df.WholeWeight <= Q3 + 1.5 * IQR) & (df.WholeWeight >= Q3 - 1.5 * IQR)]
df.loc[(df.WholeWeight <= Q3 + 1.5 * IQR) & (df.WholeWeight >= Q3 - 1.5 * IQR)]
UL = Q3 + 1.5 * IQR
replace_value = df.WholeWeight[df.WholeWeight < UL].max()
df.loc[df.WholeWeight > UL,'WholeWeight'] = replace_value
df['WholeWeight'][df.WholeWeight <= UL]
P01 = df.WholeWeight.quantile(0.01)
P99=df.WholeWeight.quantile(0.99)
df.loc[ df['WholeWeight_new'] > P99,'WholeWeight_new'] = P99
df.loc[df['WholeWeight_new'] < P01,'WholeWeight_new'] =P01
df[ df['WholeWeight_new'] > P99]['WholeWeight_new'] = P99

------------pandas 16--------------
df['WholeWeight_bin'] = pd.cut(df['WholeWeight'],5,
                               labels=[1,2,3,'5','six'])
df['WholeWeight_bin'] = pd.cut(df['WholeWeight'],5,
                               labels=range(1,6))   #等宽分段
df['WholeWeight_bin'] = pd.cut(df['WholeWeight'],5) #等宽分段
df['WholeWeight_bin'].value_counts()  
df['WholeWeight_bin'].value_counts().plot(kind='bar') #柱状图
df['WholeWeight_bin'].value_counts().plot(kind='hist') #直方图
df['WholeWeight_bin'].hist()
k=5    # 分为 5 段 , 0 到 0.2 分位数为 一段 , 
w=[i/k for i in range(k+1)]
pd.qcut(df['WholeWeight'],w)      #等频分段
pd.qcut(df['WholeWeight'],w).value_counts()
df['WholeWeight_bin']=pd.qcut(df['WholeWeight'],w,labels=range(1,6))
k=5    # 分为 5 段 , 0 到 0.2 分位数为 一段 , 
w=[i/k for i in range(k+1)]
w1=df['WholeWeight'].quantile(w)
df['WholeWeight_bin']=pd.cut(df['WholeWeight'],w1,labels=range(5))
# 指定每段宽度,可能不是等宽
#而像是等频,因为是按分位数段指明的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值