1.表格数据操作:[增删改查]
2.实现多个表格的处理
3.数据清洗操作: 缺失值,重复值,异常值,数据标准化,数据转化的操作
4.实现excel的特殊操作,生成透视表,交叉分析
5.完成统计分析
# 创建方法一
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 女
pandas.core.frame.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']]
'''
ser1=df['name'] # 一维的切法,返回的是series类型
print(ser1)
print(type(ser1)) #
ser2=df[['name']]
print(ser2) # 二维的切法,返回的是dataframe类型
print(type(ser2)) #
'''
a ss
c lx
b lx
Name: name, dtype: object
name
a ss
c lx
b lx
'''
ser3=df[['name','age']][:2]
print('切两列值\n',ser3)
'''
切两列值
name age
a ss 20
c lx 18
'''
# 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
'''
# 条件切片
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
'''
# 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')
'''
# (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 女
'''
# 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 女
'''
# 将名字为lx的人的班级改为'有问题':
df.loc[df['name']=='lx','class']='有问题'
print(df)
'''
name age sex class adress
a ss 20 男 0831 北京
c lx 18 女 有问题 北京
b lx 18 女 有问题 北京
'''
np.mean(df['age']) # 2
df['age'].mean() # 18
print(np.ptp(df['age'])) # 1.1547005383792515
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
'''
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
'''
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
'''
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))
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))
# 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())
print(data.shape)
data3=data.drop_duplicates(subset=['dishes_name','dishes_id'])
print(data3.head(3))
data=pd.read_excel(r'E:\pythonwork\数据分析\7.panada的创建\meal_order_detail.xlsx',sheet_name=[0,1],header=[0,2778])
print(data)
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行数据
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')