pandas数据处理-----(一)

pandas

1.表格数据操作:[增删改查]
2.实现多个表格的处理
3.数据清洗操作: 缺失值,重复值,异常值,数据标准化,数据转化的操作
4.实现excel的特殊操作,生成透视表,交叉分析
5.完成统计分析

pandas与numpy区别

在这里插入图片描述

一.构建dataframe

# 创建方法一
import pandas as pd
df=pd.DataFrame(data=[['ss',20,'男','0831'],['lx',18,'女','0831'],['lx',18,'女','0831']],
               index=['a','c','b'],
               columns=['name','age','sex','class']
               )
print(df)

# 创建方法二
df2=pd.DataFrame(data={'name':['ss','lx'],
                      'age':[20,18],
                       'sex':['男','女'],
                       'class':['0831','0830'],
#                        'index':['a','c']
                      })
print(df2)
print(type(df2))
'''
 name  age sex class
a   ss   20   男  0831
c   lx   18   女  0831
b   lx   18   女  0831

   age class name sex
0   20  0831   ss   男
1   18  0830   lx   女
<class 'pandas.core.frame.DataFrame'>
'''

二.dataframe的属性

print('df结构:\n',df.shape)             # df结构:(3, 4)
print('df维度:\n',df.ndim)                   # 2  
print('df的元素个数:\n',df.size)             # 12
print('df的数据类型:\n',df.dtypes)             # 
print('df的列索引:\n',df.columns)             # Index(['name', 'age', 'sex', 'class'], dtype='object')
print('df的行索引:\n',df.index)             # Index(['a', 'c', 'b'], dtype='object')
print('df的元素:\n',df.values)             # df结构:(3, 4)
'''
df的数据类型:
 name     object
age       int64
sex      object
class    object
dtype: object

df的元素:
 [['ss' 20 '' '0831']
 ['lx' 18 '' '0831']
 ['lx' 18 '' '0831']]
'''

三.df的查找

1.切一列值的方法

ser1=df['name']      # 一维的切法,返回的是series类型
print(ser1) 
print(type(ser1))    # <class 'pandas.core.series.Series'>
ser2=df[['name']]
print(ser2)          # 二维的切法,返回的是dataframe类型
print(type(ser2))    # <class 'pandas.core.frame.DataFrame'>
'''
a    ss
c    lx
b    lx
Name: name, dtype: object

  name
a   ss
c   lx
b   lx
'''

2.切两列值的方法

ser3=df[['name','age']][:2]
print('切两列值\n',ser3)
'''
切两列值
   name  age
a   ss   20
c   lx   18
'''

3.索引: df.loc[行索引名称/条件,列的索引名称] 是一个前闭后闭操作

# df.loc[[],[]]两个列表就是二维,单独传值或者一个列表表示一维
ser4=df.loc['a',:]
print(ser4)
print(df.loc['a','name'])                     #ss
print(df.loc[['a','b'],['name','age']])
print(df.loc[:'b','name'])
'''
name       ss
age        20
sex         男
class    0831
Name: a, dtype: object

  name  age
a   ss   20
b   lx   18

a    ss
c    lx
b    lx
Name: name, dtype: object
'''

4.条件切片

# 条件切片
mask=df['age']>18
print(mask)
df.loc[mask,'name']

# 获取所有年龄大于18的女同学
mask1=df['age']>18
mask2=df['sex']=='男'
mask3=mask1 & mask2
df.loc[mask3,:]
'''
a     True
c    False
b    False
Name: age, dtype: bool

  name  age sex class
a   ss   20   男  0831
'''

5.df.iloc

# df.iloc[行的位置索引,列的位置索引]
print(df)
print(df.iloc[:,1])
print(df.iloc[:2,2:])
print(df.iloc[-1,:].index)
'''
 name  age sex class
a   ss   20   男  0831
c   lx   18   女  0831
b   lx   18   女  0831

a    20
c    18
b    18
Name: age, dtype: int64

  sex class
a   男  0831
c   女  0831

Index(['name', 'age', 'sex', 'class'], dtype='object')
'''

6.df增加方法

# (1)增加一列
df['adress']=['北京','上海','北京',]
print(df)
df['adress']='北京'
print(df)
# (2)增加一行
df_mini=pd.DataFrame(data={
    'name':['zs','ls'],
    'age':[24,35],
    'sex':['男','女'],
    'class':['0831','0830']
},index=['a','b'])
df3=df.append(df_mini,ignore_index=True)    #忽略索引 a--数字
print(df3)
'''
name  age sex class adress
a   ss   20   男  0831     北京
c   lx   18   女  0831     上海
b   lx   18   女  0831     北京

  name  age sex class adress
a   ss   20   男  0831     北京
c   lx   18   女  0831     北京
b   lx   18   女  0831     北京

  adress  age class name sex
0     北京   20  0831   ss   男
1     北京   18  0831   lx   女
2     北京   18  0831   lx   女
3    NaN   24  0831   zs   男
4    NaN   35  0830   ls   女
'''

5.删除方法

# inplace=True 表示对原始表进行修改,inplace=False表示对原始表不修改,,默认False
df4=df3.drop(labels=['adress','class'],axis=1,inplace=False)
print(df4)
df5=df3.drop(labels=[0,1,2],axis=0)
print(df5)
'''
 age name sex
0   20   ss   男
1   18   lx   女
2   18   lx   女
3   24   zs   男
4   35   ls   女

  adress  age class name sex
3    NaN   24  0831   zs   男
4    NaN   35  0830   ls   女
'''

6.df更改数值方法

# 将名字为lx的人的班级改为'有问题':
df.loc[df['name']=='lx','class']='有问题'
print(df)
'''
 name  age sex class adress
a   ss   20   男  0831     北京
c   lx   18   女   有问题     北京
b   lx   18   女   有问题     北京
'''

四.统计分析

1.numpy的统计方法

np.mean(df['age'])         # 2
df['age'].mean()           # 18

2.沿用numpy的10个统计方法

(max,min,argmin,argmax,sum,mean,std,var)

3.其他方法

极差np.ptp=极大值-极小值
print(np.ptp(df['age']))     # 1.1547005383792515

4.pandas中的方法

(1) 针对都是series 一维

print(df['age'].min())            # 18
print(df['age'].std())            # 1.1547005383792515
print(df['age'].argmax())         # a
print(df3)
df['name'].mode()         # 众数      0    lx
df['name'].count()        # 非空数目   3
df['name'].value_counts() # 频数统计,一维中特有的方法

'''
 lx    2
ss    1
Name: name, dtype: int64
'''
(2)针对df类型
df.min()
df['grade']=[97,96,99]
print(df)
# 一二维都可以使用idxmax
print(df[['age','grade']].idxmax(axis=1))   # 最大值索引,横向比较
print(df[['age','grade']].idxmax(axis=0))   # 最大值索引,纵向比较
'''
 name  age sex class  grade
a   ss   20   男  0831     97
c   lx   18   女  0831     96
b   lx   18   女  0831     99

a    grade
c    grade
b    grade
dtype: object

age      a
grade    b
dtype: object
'''
(3)df.describe()

describe()作用在字符类别中返回值
count:非空数目,
unique:去重后有几个值,top:众数,
freq:众数出现的频数
数值型与字符型混合,返回数值型参数

print(df[['age','grade']].describe())
print(df[['name','sex']].describe())
print(df[['name','age']].describe())

'''
    age      grade
count   3.000000   3.000000
mean   18.666667  97.333333
std     1.154701   1.527525
min    18.000000  96.000000
25%    18.000000  96.500000
50%    18.000000  97.000000
75%    19.000000  98.000000
max    20.000000  99.000000

       name sex
count     3   3
unique    2   2
top      lx   女
freq      2   2

             age
count   3.000000
mean   18.666667
std     1.154701
min    18.000000
25%    18.000000
50%    18.000000
75%    19.000000
max    20.000000
'''
(4)时间参数处理
place_order_time=data['place_order_time'].astype('str')
# 1.将字符串类型转化为标准时间类型格式
# print(place_order_time)
# 2.时间类型提取
# ser.dt.时间属性
# year/month/day/hour/minute/second/data(日期)
'''ser.dt.时间属性:
年--year   月--month   日--day  小时--hour   分钟数--minute    秒--second
日期--date   一年中的第几周--week    季节--quarter   一年中的第几天--dayofyear
一周的第几天--dayofweek    星期名称-- weekday_name     是否是闰年--is_leap_year
'''
# 增加一列年份
data['year']=data['place_order_time'].dt.year
data2=data['place_order_time'].dt.month.head()
# print(data2)
# (1) 时间加减
time1=data['place_order_time'].head()
time2=data['place_order_time'].tail().reset_index()['place_order_time']      # 重新设置索引
# print(time1)
# print(time2)
# print(time2-time1)

# (2)整体+时间戳---某一列整体时间平移
'''weeks 星期    miliseconds 毫秒   days 天     
hours 小时    minutes  分钟   second 秒'''
# print(data['place_order_time']+pd.Timedelta(days=1))
# print(data['place_order_time']-pd.Timedelta(hours=1))
(5)groupby分组
print(data.groupby(by='order_id')['amounts'].sum())
print(data.groupby(by='order_id')[['amounts','counts']].sum().head())
# 排序sort_value(by='按什么排序',倒序用这个ascending=False)
print(data.groupby(by='order_id')[['amounts','counts']].sum().sort_values(by='counts',ascending=False))
(5)groupby分组–聚合
# 1.pandas/numpy中的统计方法: sum/mean/std/var
# 2.特殊函数完成聚合操作---np.ptp只能作用于单列
print(data[['amounts','counts']].agg([np.sum,np.mean,np.std]))
print(data[['amounts','counts']].agg([np.ptp]))
print(data[['amounts','counts']].agg({'amounts':np.mean,'counts':np.sum}))
print(data[['amounts','counts']].agg({'amounts':[np.mean,np.std],'counts':np.sum}))
data3=data.groupby(by='order_id')[['amounts','counts']].agg({'amounts':[np.mean,np.std],'counts':np.sum})['amounts']
print(data3)
# 查找某一列包含番茄的值
mask=data['dishes_name'].str.contains('番茄')
print(data.loc[mask,'dishes_name'].str.strip())
(5)df中去重的操作
print(data.shape)
data3=data.drop_duplicates(subset=['dishes_name','dishes_id'])
print(data3.head(3))

六 读取文档数据

1.读取excel数据:

  • (1).可以传入整型,表示从0开始的索引
  • (2).可以传入表名称:[‘表名1’,‘表名2’]
  • (3).可以传入None,表示一次性获取所有表格
  • (4).可以传入list sheetname=[0,1,2] sheetname: 切换sheet表格

2.header:表示选择哪一行作为列索引,默认为第一行,当header不为0时,会将默认为列索引之前的行全部删除不读

data=pd.read_excel(r'E:\pythonwork\数据分析\7.panada的创建\meal_order_detail.xlsx',sheet_name=[0,1],header=[0,2778])
print(data)

3.当文件中没有给定表头时,需要将header设置为None,并且传入与列数量一致的list,name=[]

data=pd.read_excel(r'E:\pythonwork\数据分析\7.panada的创建\meal_order_detail.xlsx',
                   # sheet_name=[0,1],
                   # names=[1,2]
                   names=np.arange(19),    # 添加表头
                   skiprows=[0,1],         # 删除第0行和第一行
                   header=None,            # 第0行作为表头None和0不一样
                   )
print(data)
print(data.head(6))         # 前6行数据
print(data.tail(5))         # 最后5行数据

七.读取csv文件

1.csv属于文本文件,逗号分隔符文件,编码一般为gbk

order=pd.read_csv(r'E:\pythonwork\数据分析\7.panada的创建\meal_order_info.csv',
            sep=',',                    # 分隔符,在csv文件中默认逗号分隔
            encoding='gbk',             # csv一般是gbk格式
            # engine='python'           # 如果报错加这个修改
            )
print(order.head())

八.读取文本文件

table=pd.read_table(r'E:\pythonwork\数据分析\7.panada的创建\meal_order_info.csv',
            sep=',',                    # csv的分隔符,在csv文件中默认逗号分隔
            encoding='gbk',
            # delimiter=','               # 读文本文件的分隔符
            # engine='python'             # 报错的话,加这个试试
            )
print(table)

九保存文件

data.to_excel('11.xlsx')
order.to_csv('11.csv')
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值