pandas第三方库

# 一维数组与常用操作
import pandas as pd

# 设置输出结果列对齐
pd.set_option('display.unicode.ambiguous_as_wide',True)
pd.set_option('display.unicode.east_asian_width',True)

# 创建 从 0 开始的非负整数索引
s1 = pd.Series(range(1,20,5))
'''
0     1
1     6
2    11
3    16
dtype: int64
'''
# 使用字典创建 Series 字典的键作为索引
s2 = pd.Series({'语文':95,'数学':98,'Python':100,'物理':97,'化学':99})
'''
语文       95
数学       98
Python    100
物理       97
化学       99
dtype: int64
'''
# 修改 Series 对象的值
s1[3] = -17
'''
0     1
1     6
2    11
3   -17
dtype: int64
'''
s2['语文'] = 94
'''
语文       94
数学       98
Python    100
物理       97
化学       99
dtype: int64
'''
# 查看 s1 的绝对值
abs(s1)
'''
0     1
1     6
2    11
3    17
dtype: int64
'''
# 将 s1 所有的值都加 5
s1 + 5
'''
0     6
1    11
2    16
3   -12
dtype: int64
'''
# 在 s1 的索引下标前加入参数值
s1.add_prefix(2)
'''
20     1
21     6
22    11
23   -17
dtype: int64
'''
# s2 数据的直方图
s2.hist()

# 每行索引后面加上 hany
s2.add_suffix('hany')
'''
语文hany       94
数学hany       98
Pythonhany    100
物理hany       97
化学hany       99
dtype: int64
'''
# 查看 s2 中最大值的索引
s2.argmax()
# 'Python'

# 查看 s2 的值是否在指定区间内
s2.between(90,100,inclusive = True)
'''
语文      True
数学      True
Python    True
物理      True
化学      True
dtype: bool
'''
# 查看 s2 中 97 分以上的数据
s2[s2 > 97]
'''
数学       98
Python    100
化学       99
dtype: int64
'''
# 查看 s2 中大于中值的数据
s2[s2 > s2.median()]
'''
Python    100
化学       99
dtype: int64
'''
# s2 与数字之间的运算,开平方 * 10 保留一位小数
round((s2**0.5)*10,1)
'''
语文       97.0
数学       99.0
Python    100.0
物理       98.5
化学       99.5
dtype: float64
'''
# s2 的中值
s2.median()
# 98.0

# s2 中最小的两个数
s2.nsmallest(2)
'''
语文    94
物理    97
dtype: int64
'''
# s2 中最大的两个数
s2.nlargest(2)
'''
Python    100
化学       99
dtype: int64
'''
# Series 对象之间的运算,对相同索引进行计算,不是相同索引的使用 NaN
pd.Series(range(5)) + pd.Series(range(5,10))
'''
0     5
1     7
2     9
3    11
4    13
dtype: int64
'''
# pipe 对 Series 对象使用匿名函数
pd.Series(range(5)).pipe(lambda x,y,z :(x**y)%z,2,5)
'''
0    0
1    1
2    4
3    4
4    1
dtype: int64
'''
pd.Series(range(5)).pipe(lambda x:x+3)
'''
0    3
1    4
2    5
3    6
4    7
dtype: int64
'''
pd.Series(range(5)).pipe(lambda x:x+3).pipe(lambda x:x*3)
'''
0     9
1    12
2    15
3    18
4    21
dtype: int64
'''
# 对 Series 对象使用匿名函数
pd.Series(range(5)).apply(lambda x:x+3)
'''
0    3
1    4
2    5
3    6
4    7
dtype: int64
'''
# 查看标准差
pd.Series(range(0,5)).std()
# 1.5811388300841898

# 查看无偏方差
pd.Series(range(0,5)).var()
# 2.5

# 查看无偏标准差
pd.Series(range(0,5)).sem()
# 0.7071067811865476

# 查看是否存在等价于 True 的值
any(pd.Series([3,0,True]))
# True

# 查看是否所有的值都等价于 True
all(pd.Series([3,0,True]))
# False

# 时间序列和常用操作
import pandas as pd

# 每隔五天--5D
pd.date_range(start = '20200101',end = '20200131',freq = '5D')
'''
DatetimeIndex(['2020-01-01', '2020-01-06', '2020-01-11', '2020-01-16',
               '2020-01-21', '2020-01-26', '2020-01-31'],
              dtype='datetime64[ns]', freq='5D')
'''
# 每隔一周--W
pd.date_range(start = '20200301',end = '20200331',freq = 'W')
'''
DatetimeIndex(['2020-03-01', '2020-03-08', '2020-03-15', '2020-03-22',
               '2020-03-29'],
              dtype='datetime64[ns]', freq='W-SUN')
'''
# 间隔两天,五个数据
pd.date_range(start = '20200301',periods = 5,freq = '2D')
'''
DatetimeIndex(['2020-03-01', '2020-03-03', '2020-03-05', '2020-03-07',
               '2020-03-09'],
              dtype='datetime64[ns]', freq='2D')
'''
# 间隔三小时,八个数据
pd.date_range(start = '20200301',periods = 8,freq = '3H')
'''
DatetimeIndex(['2020-03-01 00:00:00', '2020-03-01 03:00:00',
               '2020-03-01 06:00:00', '2020-03-01 09:00:00',
               '2020-03-01 12:00:00', '2020-03-01 15:00:00',
               '2020-03-01 18:00:00', '2020-03-01 21:00:00'],
              dtype='datetime64[ns]', freq='3H')
'''
# 三点开始,十二个数据,间隔一分钟
pd.date_range(start = '202003010300',periods = 12,freq = 'T')
'''
DatetimeIndex(['2020-03-01 03:00:00', '2020-03-01 03:01:00',
               '2020-03-01 03:02:00', '2020-03-01 03:03:00',
               '2020-03-01 03:04:00', '2020-03-01 03:05:00',
               '2020-03-01 03:06:00', '2020-03-01 03:07:00',
               '2020-03-01 03:08:00', '2020-03-01 03:09:00',
               '2020-03-01 03:10:00', '2020-03-01 03:11:00'],
              dtype='datetime64[ns]', freq='T')
'''
# 每个月的最后一天
pd.date_range(start = '20190101',end = '20191231',freq = 'M')
'''
DatetimeIndex(['2019-01-31', '2019-02-28', '2019-03-31', '2019-04-30',
               '2019-05-31', '2019-06-30', '2019-07-31', '2019-08-31',
               '2019-09-30', '2019-10-31', '2019-11-30', '2019-12-31'],
              dtype='datetime64[ns]', freq='M')
'''
# 间隔一年,六个数据,年末最后一天
pd.date_range(start = '20190101',periods = 6,freq = 'A')
'''
DatetimeIndex(['2019-12-31', '2020-12-31', '2021-12-31', '2022-12-31',
               '2023-12-31', '2024-12-31'],
              dtype='datetime64[ns]', freq='A-DEC')
'''
# 间隔一年,六个数据,年初最后一天
pd.date_range(start = '20200101',periods = 6,freq = 'AS')
'''
DatetimeIndex(['2020-01-01', '2021-01-01', '2022-01-01', '2023-01-01',
               '2024-01-01', '2025-01-01'],
              dtype='datetime64[ns]', freq='AS-JAN')
'''
# 使用 Series 对象包含时间序列对象,使用特定索引
data = pd.Series(index = pd.date_range(start = '20200321',periods = 24,freq = 'H'),data = range(24))
'''
2020-03-21 00:00:00     0
2020-03-21 01:00:00     1
2020-03-21 02:00:00     2
2020-03-21 03:00:00     3
2020-03-21 04:00:00     4
2020-03-21 05:00:00     5
2020-03-21 06:00:00     6
2020-03-21 07:00:00     7
2020-03-21 08:00:00     8
2020-03-21 09:00:00     9
2020-03-21 10:00:00    10
2020-03-21 11:00:00    11
2020-03-21 12:00:00    12
2020-03-21 13:00:00    13
2020-03-21 14:00:00    14
2020-03-21 15:00:00    15
2020-03-21 16:00:00    16
2020-03-21 17:00:00    17
2020-03-21 18:00:00    18
2020-03-21 19:00:00    19
2020-03-21 20:00:00    20
2020-03-21 21:00:00    21
2020-03-21 22:00:00    22
2020-03-21 23:00:00    23
Freq: H, dtype: int64
'''
# 查看前五个数据
data[:5]
'''
2020-03-21 00:00:00    0
2020-03-21 01:00:00    1
2020-03-21 02:00:00    2
2020-03-21 03:00:00    3
2020-03-21 04:00:00    4
Freq: H, dtype: int64
'''
# 三分钟重采样,计算均值
data.resample('3H').mean()
'''
2020-03-21 00:00:00     1
2020-03-21 03:00:00     4
2020-03-21 06:00:00     7
2020-03-21 09:00:00    10
2020-03-21 12:00:00    13
2020-03-21 15:00:00    16
2020-03-21 18:00:00    19
2020-03-21 21:00:00    22
Freq: 3H, dtype: int64
'''
# 五分钟重采样,求和
data.resample('5H').sum()
'''
2020-03-21 00:00:00    10
2020-03-21 05:00:00    35
2020-03-21 10:00:00    60
2020-03-21 15:00:00    85
2020-03-21 20:00:00    86
Freq: 5H, dtype: int64
'''
# 计算OHLC open,high,low,close
data.resample('5H').ohlc()
'''
                     open  high  low  close
2020-03-21 00:00:00     0     4    0      4
2020-03-21 05:00:00     5     9    5      9
2020-03-21 10:00:00    10    14   10     14
2020-03-21 15:00:00    15    19   15     19
2020-03-21 20:00:00    20    23   20     23
'''
# 将日期替换为第二天
data.index = data.index + pd.Timedelta('1D')
# 查看前五条数据
data[:5]
'''
2020-03-22 00:00:00    0
2020-03-22 01:00:00    1
2020-03-22 02:00:00    2
2020-03-22 03:00:00    3
2020-03-22 04:00:00    4
Freq: H, dtype: int64
'''
# 查看指定日期是星期几
# pd.Timestamp('20200321').weekday_name
# 'Saturday'

# 查看指定日期的年份是否是闰年
pd.Timestamp('20200301').is_leap_year
# True

# 查看指定日期所在的季度和月份
day = pd.Timestamp('20200321')
# Timestamp('2020-03-21 00:00:00')

# 查看日期的季度
day.quarter
# 1

# 查看日期所在的月份
day.month
# 3

# 转换为 python 的日期时间对象
day.to_pydatetime()
# datetime.datetime(2020, 3, 21, 0, 0)

# DateFrame 的创建,包含部分:index , column , values
import numpy as np
import pandas as pd

# 创建一个 DataFrame 对象
dataframe = pd.DataFrame(np.random.randint(1,20,(5,3)),
                         index = range(5),
                         columns = ['A','B','C'])
'''
    A   B   C
0  17   9  19
1  14   5   8
2   7  18  13
3  13  16   2
4  18   6   5
'''
# 索引为时间序列
dataframe2 = pd.DataFrame(np.random.randint(5,15,(9,3)),
                          index = pd.date_range(start = '202003211126',
                                                end = '202003212000',
                                                freq = 'H'),
                          columns = ['Pandas','爬虫','比赛'])
'''
                     Pandas  爬虫  比赛
2020-03-21 11:26:00       8  10   8
2020-03-21 12:26:00       9  14   9
2020-03-21 13:26:00       9   5  13
2020-03-21 14:26:00       9   7   7
2020-03-21 15:26:00      11  10  14
2020-03-21 16:26:00      12   7  10
2020-03-21 17:26:00      11  11  13
2020-03-21 18:26:00       8  13   8
2020-03-21 19:26:00       7   7  13
'''
# 使用字典进行创建
dataframe3 = pd.DataFrame({'语文':[87,79,67,92],
                           '数学':[93,89,80,77],
                           '英语':[88,95,76,77]},
                          index = ['张三','李四','王五','赵六'])
'''
    语文  数学  英语
张三  87  93  88
李四  79  89  95
王五  67  80  76
赵六  92  77  77
'''
# 创建时自动扩充
dataframe4 = pd.DataFrame({'A':range(5,10),'B':3})
'''
   A  B
0  5  3
1  6  3
2  7  3
3  8  3
4  9  3
'''

# C:\Users\lenovo\Desktop\总结\Python
# 读取 Excel 文件并进行筛选

import pandas as pd

# 设置列对齐
pd.set_option("display.unicode.ambiguous_as_wide",True)
pd.set_option("display.unicode.east_asian_width",True)

# 读取工号姓名时段交易额,使用默认索引
dataframe = pd.read_excel(r'C:\Users\lenovo\Desktop\总结\Python\超市营业额.xlsx',
                          usecols = ['工号','姓名','时段','交易额'])

# 打印前十行数据
dataframe[:10]
'''
   工号  姓名         时段  交易额
0  1001  张三   9:00-14:00    2000
1  1002  李四  14:00-21:00    1800
2  1003  王五   9:00-14:00     800
3  1004  赵六  14:00-21:00    1100
4  1005  周七   9:00-14:00     600
5  1006  钱八  14:00-21:00     700
6  1006  钱八   9:00-14:00     850
7  1001  张三  14:00-21:00     600
8  1001  张三   9:00-14:00    1300
9  1002  李四  14:00-21:00    1500
'''
# 跳过 1 2 4 行,以第一列姓名为索引
dataframe2 = pd.read_excel(r'C:\Users\lenovo\Desktop\总结\Python\超市营业额.xlsx',
                           skiprows = [1,2,4],
                           index_col = 1)
'''注:张三李四赵六的第一条数据跳过
      工号      日期         时段  交易额      柜台
姓名                                               
王五  1003  20190301   9:00-14:00     800      食品
周七  1005  20190301   9:00-14:00     600    日用品
钱八  1006  20190301  14:00-21:00     700    日用品
钱八  1006  20190301   9:00-14:00     850  蔬菜水果
张三  1001  20190302  14:00-21:00     600  蔬菜水果
'''

# 筛选符合特定条件的数据
# 读取超市营业额数据
dataframe = pd.read_excel(r'C:\Users\lenovo\Desktop\总结\Python\超市营业额.xlsx')

# 查看 5 到 10 的数据
dataframe[5:11]
'''
    工号  姓名      日期         时段  交易额      柜台
5   1006  钱八  20190301  14:00-21:00     700    日用品
6   1006  钱八  20190301   9:00-14:00     850  蔬菜水果
7   1001  张三  20190302  14:00-21:00     600  蔬菜水果
8   1001  张三  20190302   9:00-14:00    1300    化妆品
9   1002  李四  20190302  14:00-21:00    1500    化妆品
10  1003  王五  20190302   9:00-14:00    1000      食品
'''
# 查看第六行的数据,左闭右开
dataframe.iloc[5]
'''
工号             1006
姓名             钱八
时段      14:00-21:00
交易额            700
Name: 5, dtype: object
'''
dataframe[:5]
'''
   工号  姓名         时段  交易额
0  1001  张三   9:00-14:00    2000
1  1002  李四  14:00-21:00    1800
2  1003  王五   9:00-14:00     800
3  1004  赵六  14:00-21:00    1100
4  1005  周七   9:00-14:00     600
'''
# 查看第 1 3 4 行的数据
dataframe.iloc[[0,2,3],:]
'''
   工号  姓名         时段  交易额
0  1001  张三   9:00-14:00    2000
2  1003  王五   9:00-14:00     800
3  1004  赵六  14:00-21:00    1100
'''
# 查看第 1 3 4 行的第 1 2 列
dataframe.iloc[[0,2,3],[0,1]]
'''
   工号  姓名
0  1001  张三
2  1003  王五
3  1004  赵六
'''
# 查看前五行指定,姓名、时段和交易额的数据
dataframe[['姓名','时段','交易额']][:5]
'''
   姓名         时段  交易额
0  张三   9:00-14:00    2000
1  李四  14:00-21:00    1800
2  王五   9:00-14:00     800
3  赵六  14:00-21:00    1100
4  周七   9:00-14:00     600
'''
dataframe[:5][['姓名','时段','交易额']]
'''
   姓名         时段  交易额
0  张三   9:00-14:00    2000
1  李四  14:00-21:00    1800
2  王五   9:00-14:00     800
3  赵六  14:00-21:00    1100
4  周七   9:00-14:00     600
'''
# 查看第 2 4 5 行 姓名,交易额 数据 loc 函数,包含结尾
dataframe.loc[[1,3,4],['姓名','交易额']]
'''
   姓名  交易额
1  李四    1800
3  赵六    1100
4  周七     600
'''
# 查看第四行的姓名数据
dataframe.at[3,'姓名']
# '赵六'

# 查看交易额大于 1700 的数据
dataframe[dataframe['交易额'] > 1700]
'''
   工号  姓名         时段  交易额
0  1001  张三   9:00-14:00    2000
1  1002  李四  14:00-21:00    1800
'''
# 查看交易额总和
dataframe.sum()
'''
工号                                                  17055
姓名      张三李四王五赵六周七钱八钱八张三张三李四王五赵六周七钱八李四王五张三...
时段      9:00-14:0014:00-21:009:00-14:0014:00-21:009:00...
交易额                                                17410
dtype: object
'''
# 某一时段的交易总和
dataframe[dataframe['时段'] == '14:00-21:00']['交易额'].sum()
# 8300

# 查看张三在下午14:00之后的交易情况
dataframe[(dataframe.姓名 == '张三') & (dataframe.时段 == '14:00-21:00')][:10]
'''
   工号  姓名         时段  交易额
7  1001  张三  14:00-21:00     600
'''
# 查看日用品的销售总额
# dataframe[dataframe['柜台'] == '日用品']['交易额'].sum()

# 查看张三总共的交易额
dataframe[dataframe['姓名'].isin(['张三'])]['交易额'].sum()
# 5200

# 查看交易额在 1500~3000 之间的记录
dataframe[dataframe['交易额'].between(1500,3000)]
'''
   工号  姓名         时段  交易额
0  1001  张三   9:00-14:00    2000
1  1002  李四  14:00-21:00    1800
9  1002  李四  14:00-21:00    1500
'''


# 查看数据特征和统计信息
import pandas as pd
# 读取文件
dataframe = pd.read_excel(r'C:\Users\lenovo\Desktop\总结\Python\超市营业额.xlsx')

# 查看所有的交易额信息
dataframe['交易额'].describe()
'''
count      17.000000
mean     1024.117647
std       428.019550
min       580.000000
25%       700.000000
50%       850.000000
75%      1300.000000
max      2000.000000
Name: 交易额, dtype: float64
'''
# 查看四分位数
dataframe['交易额'].quantile([0,0.25,0.5,0.75,1.0])
'''
0.00     580.0
0.25     700.0
0.50     850.0
0.75    1300.0
1.00    2000.0
Name: 交易额, dtype: float64
'''
# 交易额中值
dataframe['交易额'].median()
# 850.0

# 交易额最小的三个数据
dataframe['交易额'].nsmallest(3)
'''
12    580
4     600
7     600
Name: 交易额, dtype: int64
'''
dataframe.nsmallest(3,'交易额')
'''
      工号  姓名        日期           时段  交易额    柜台
12  1005  周七  20190302   9:00-14:00  580   日用品
4   1005  周七  20190301   9:00-14:00  600   日用品
7   1001  张三  20190302  14:00-21:00  600  蔬菜水果
'''
# 交易额最大的两个数据
dataframe['交易额'].nlargest(2)
'''
0    2000
1    1800
Name: 交易额, dtype: int64
'''
dataframe.nlargest(2,'交易额')
'''
     工号  姓名        日期           时段   交易额   柜台
0  1001  张三  20190301   9:00-14:00  2000  化妆品
1  1002  李四  20190301  14:00-21:00  1800  化妆品
'''
# 查看最后一个日期
dataframe['日期'].max()
# 20190303

# 查看最小的工号
dataframe['工号'].min()
# 1001

# 第一个最小交易额的行下标
index = dataframe['交易额'].idxmin()
# 0

# 第一个最小交易额
dataframe.loc[index,'交易额']
# 580

# 最大交易额的行下标
index = dataframe['交易额'].idxmax()
dataframe.loc[index,'交易额']
# 2000


import pandas as pd

# 设置列对齐
pd.set_option("display.unicode.ambiguous_as_wide",True)
pd.set_option("display.unicode.east_asian_width",True)

# 读取工号姓名时段交易额,使用默认索引
dataframe = pd.read_excel(r'C:\Users\lenovo\Desktop\总结\Python\超市营业额.xlsx',
                          usecols = ['工号','姓名','时段','交易额','柜台'])
dataframe[:5]
'''
   工号  姓名         时段  交易额    柜台
0  1001  张三   9:00-14:00    2000  化妆品
1  1002  李四  14:00-21:00    1800  化妆品
2  1003  王五   9:00-14:00     800    食品
3  1004  赵六  14:00-21:00    1100    食品
4  1005  周七   9:00-14:00     600  日用品
'''
# 按照交易额和工号降序排序,查看五条数据
dataframe.sort_values(by = ['交易额','工号'],ascending = False)[:5]
'''
    工号  姓名         时段  交易额    柜台
0   1001  张三   9:00-14:00    2000  化妆品
1   1002  李四  14:00-21:00    1800  化妆品
9   1002  李四  14:00-21:00    1500  化妆品
8   1001  张三   9:00-14:00    1300  化妆品
16  1001  张三   9:00-14:00    1300  化妆品
'''
# 按照交易额和工号升序排序,查看五条数据
dataframe.sort_values(by = ['交易额','工号'])[:5]
'''
    工号  姓名         时段  交易额      柜台
12  1005  周七   9:00-14:00     580    日用品
7   1001  张三  14:00-21:00     600  蔬菜水果
4   1005  周七   9:00-14:00     600    日用品
14  1002  李四   9:00-14:00     680  蔬菜水果
5   1006  钱八  14:00-21:00     700    日用品
'''
# 按照交易额降序和工号升序排序,查看五条数据
dataframe.sort_values(by = ['交易额','工号'],ascending = [False,True])[:5]
'''
    工号  姓名         时段  交易额    柜台
0   1001  张三   9:00-14:00    2000  化妆品
1   1002  李四  14:00-21:00    1800  化妆品
9   1002  李四  14:00-21:00    1500  化妆品
8   1001  张三   9:00-14:00    1300  化妆品
16  1001  张三   9:00-14:00    1300  化妆品
'''
# 按工号升序排序
dataframe.sort_values(by = ['工号'])[:5]
'''
    工号  姓名         时段  交易额      柜台
0   1001  张三   9:00-14:00    2000    化妆品
7   1001  张三  14:00-21:00     600  蔬菜水果
8   1001  张三   9:00-14:00    1300    化妆品
16  1001  张三   9:00-14:00    1300    化妆品
1   1002  李四  14:00-21:00    1800    化妆品
'''
dataframe.sort_values(by = ['工号'],na_position = 'last')[:5]
'''
    工号  姓名         时段  交易额      柜台
0   1001  张三   9:00-14:00    2000    化妆品
7   1001  张三  14:00-21:00     600  蔬菜水果
8   1001  张三   9:00-14:00    1300    化妆品
16  1001  张三   9:00-14:00    1300    化妆品
1   1002  李四  14:00-21:00    1800    化妆品
'''
# 按列名升序排序
dataframe.sort_index(axis = 1)[:5]
'''
    交易额  姓名  工号         时段      柜台
0     2000  张三  1001   9:00-14:00    化妆品
1     1800  李四  1002  14:00-21:00    化妆品
2      800  王五  1003   9:00-14:00      食品
3     1100  赵六  1004  14:00-21:00      食品
4      600  周七  1005   9:00-14:00    日用品
'''
dataframe.sort_index(axis = 1,ascending = True)[:5]
'''
   交易额  姓名  工号         时段      柜台
0     2000  张三  1001   9:00-14:00    化妆品
1     1800  李四  1002  14:00-21:00    化妆品
2      800  王五  1003   9:00-14:00      食品
3     1100  赵六  1004  14:00-21:00      食品
4      600  周七  1005   9:00-14:00    日用品
'''

# 分组与聚合
import pandas as pd
import numpy as np

# 设置列对齐
pd.set_option("display.unicode.ambiguous_as_wide",True)
pd.set_option("display.unicode.east_asian_width",True)

# 读取工号姓名时段交易额,使用默认索引
dataframe = pd.read_excel(r'C:\Users\lenovo\Desktop\总结\Python\超市营业额.xlsx',
                          usecols = ['工号','姓名','时段','交易额','柜台'])

# 对 5 的余数进行分组
dataframe.groupby(by = lambda num:num % 5)['交易额'].sum()
'''
0    4530
1    5000
2    1980
3    3120
4    2780
Name: 交易额, dtype: int64
'''
# 查看索引为 7 15 的交易额
dataframe.groupby(by = {7:'索引为7的行',15:'索引为15的行'})['交易额'].sum()
'''
索引为15的行    830
索引为7的行     600
Name: 交易额, dtype: int64
'''
# 查看不同时段的交易总额
dataframe.groupby(by = '时段')['交易额'].sum()
'''
时段
14:00-21:00    8300
9:00-14:00     9110
Name: 交易额, dtype: int64
'''
# 各柜台的销售总额
dataframe.groupby(by = '柜台')['交易额'].sum()
'''
柜台
化妆品      7900
日用品      2600
蔬菜水果    2960
食品        3950
Name: 交易额, dtype: int64
'''
# 查看每个人在每个时段购买的次数
count = dataframe.groupby(by = '姓名')['时段'].count()
'''
姓名
周七    2
张三    4
李四    3
王五    3
赵六    2
钱八    3
Name: 时段, dtype: int64
'''
#
count.name = '交易人和次数'
'''

'''
# 每个人的交易额平均值并排序
dataframe.groupby(by = '姓名')['交易额'].mean().round(2).sort_values()
'''
姓名
周七     590.00
钱八     756.67
王五     876.67
赵六    1075.00
张三    1300.00
李四    1326.67
Name: 交易额, dtype: float64
'''
# 每个人的交易额
dataframe.groupby(by = '姓名').sum()['交易额'].apply(int)
'''
姓名
周七    1180
张三    5200
李四    3980
王五    2630
赵六    2150
钱八    2270
Name: 交易额, dtype: int64
'''
# 每一个员工交易额的中值
data = dataframe.groupby(by = '姓名').median()
'''
      工号  交易额
姓名              
周七  1005     590
张三  1001    1300
李四  1002    1500
王五  1003     830
赵六  1004    1075
钱八  1006     720
'''
data['交易额']
'''
姓名
周七     590
张三    1300
李四    1500
王五     830
赵六    1075
钱八     720
Name: 交易额, dtype: int64
'''
# 查看交易额对应的排名
data['排名'] = data['交易额'].rank(ascending = False)
data[['交易额','排名']]
'''
      交易额  排名
姓名              
周七     590   6.0
张三    1300   2.0
李四    1500   1.0
王五     830   4.0
赵六    1075   3.0
钱八     720   5.0
'''
# 每个人不同时段的交易额
dataframe.groupby(by = ['姓名','时段'])['交易额'].sum()
'''
姓名  时段       
周七  9:00-14:00     1180
张三  14:00-21:00     600
      9:00-14:00     4600
李四  14:00-21:00    3300
      9:00-14:00      680
王五  14:00-21:00     830
      9:00-14:00     1800
赵六  14:00-21:00    2150
钱八  14:00-21:00    1420
      9:00-14:00      850
Name: 交易额, dtype: int64
'''
# 设置各时段累计
dataframe.groupby(by = ['姓名'])['时段','交易额'].aggregate({'交易额':np.sum,'时段':lambda x:'各时段累计'})
'''
      交易额        时段
姓名                    
周七    1180  各时段累计
张三    5200  各时段累计
李四    3980  各时段累计
王五    2630  各时段累计
赵六    2150  各时段累计
钱八    2270  各时段累计
'''
# 对指定列进行聚合,查看最大,最小,和,平均值,中值
dataframe.groupby(by = '姓名').agg(['max','min','sum','mean','median'])
'''
      工号                          交易额                                
       max   min   sum  mean median    max   min   sum         mean median
姓名                                                                      
周七  1005  1005  2010  1005   1005    600   580  1180   590.000000    590
张三  1001  1001  4004  1001   1001   2000   600  5200  1300.000000   1300
李四  1002  1002  3006  1002   1002   1800   680  3980  1326.666667   1500
王五  1003  1003  3009  1003   1003   1000   800  2630   876.666667    830
赵六  1004  1004  2008  1004   1004   1100  1050  2150  1075.000000   1075
钱八  1006  1006  3018  1006   1006    850   700  2270   756.666667    720
'''
# 查看部分聚合后的结果
dataframe.groupby(by = '姓名').agg(['max','min','sum','mean','median'])['交易额']
'''
       max   min   sum         mean  median
姓名                                       
周七   600   580  1180   590.000000     590
张三  2000   600  5200  1300.000000    1300
李四  1800   680  3980  1326.666667    1500
王五  1000   800  2630   876.666667     830
赵六  1100  1050  2150  1075.000000    1075
钱八   850   700  2270   756.666667     720
'''


# 处理异常值缺失值重复值数据差分
import pandas as pd
import numpy as np
import copy

# 设置列对齐
pd.set_option("display.unicode.ambiguous_as_wide",True)
pd.set_option("display.unicode.east_asian_width",True)

# 异常值

# 读取工号姓名时段交易额,使用默认索引
dataframe = pd.read_excel(r'C:\Users\lenovo\Desktop\总结\Python\超市营业额.xlsx')

# 查看交易额低于 2000 的三条数据
# dataframe[dataframe.交易额 < 2000]
dataframe[dataframe.交易额 < 2000][:3]
'''
   工号  姓名      日期         时段  交易额    柜台
1  1002  李四  20190301  14:00-21:00    1800  化妆品
2  1003  王五  20190301   9:00-14:00     800    食品
3  1004  赵六  20190301  14:00-21:00    1100    食品
'''
# 查看上浮了 50% 之后依旧低于 1500 的交易额,查看 4 条数据
dataframe.loc[dataframe.交易额 < 1500,'交易额'] = dataframe[dataframe.交易额 < 1500]['交易额'].map(lambda num:num*1.5)
dataframe[dataframe.交易额 < 1500][:4]
'''
    工号  姓名      日期         时段  交易额      柜台
2   1003  王五  20190301   9:00-14:00  1200.0      食品
4   1005  周七  20190301   9:00-14:00   900.0    日用品
5   1006  钱八  20190301  14:00-21:00  1050.0    日用品
6   1006  钱八  20190301   9:00-14:00  1275.0  蔬菜水果
'''
# 查看交易额大于 2500 的数据
dataframe[dataframe.交易额 > 2500]
'''
Empty DataFrame
Columns: [工号, 姓名, 日期, 时段, 交易额, 柜台]
Index: []
'''
# 查看交易额低于 900 或 高于 1800 的数据
dataframe[(dataframe.交易额 < 900)|(dataframe.交易额 > 1800)]
'''
    工号  姓名      日期        时段  交易额    柜台
0   1001  张三  20190301  9:00-14:00  2000.0  化妆品
8   1001  张三  20190302  9:00-14:00  1950.0  化妆品
12  1005  周七  20190302  9:00-14:00   870.0  日用品
16  1001  张三  20190303  9:00-14:00  1950.0  化妆品
'''
#  将所有低于 200 的交易额都替换成 200 处理异常值
dataframe.loc[dataframe.交易额 < 200,'交易额'] = 200

# 查看低于 1500 的交易额个数
dataframe.loc[dataframe.交易额 < 1500,'交易额'].count()
# 9

# 将大于 3000 元的都替换为 3000 元
dataframe.loc[dataframe.交易额 > 3000,'交易额'] = 3000

# 缺失值

# 查看有多少行数据
len(dataframe)
# 17

# 丢弃缺失值之后的行数
len(dataframe.dropna())
# 17

# 包含缺失值的行
dataframe[dataframe['交易额'].isnull()]
'''
Empty DataFrame
Columns: [工号, 姓名, 日期, 时段, 交易额, 柜台]
Index: []
'''
# 使用固定值替换缺失值
# dff = copy.deepcopy(dataframe)
# dff.loc[dff.交易额.isnull(),'交易额'] = 999
# 将缺失值设定为 999,包含结尾
# dff.iloc[[1,4,17],:]

# 使用交易额的均值替换缺失值
# dff = copy.deepcopy(dataframe)
# for i in dff[dff.交易额.isnull()].index:
#     dff.loc[i,'交易额'] = round(dff.loc[dff.姓名 == dff.loc[i,'姓名'],'交易额'].mean())
# dff.iloc[[1,4,17],:]

# 使用整体均值的 80% 填充缺失值
# dataframe.fillna({'交易额':round(dataframe['交易额'].mean() * 0.8)},inplace = True)
# dataframe.iloc[[1,4,16],:]


# 重复值
dataframe[dataframe.duplicated()]
'''
Empty DataFrame
Columns: [工号, 姓名, 日期, 时段, 交易额, 柜台]
Index: []
'''
# dff = dataframe[['工号','姓名','日期','交易额']]
# dff = dff[dff.duplicated()]
# for row in dff.values:
#     df[(df.工号 == row[0]) & (df.日期 == row[2]) &(df.交易额 == row[3])]


# 丢弃重复行
dataframe = dataframe.drop_duplicates()

# 查看是否有录入错误的工号和姓名
dff = dataframe[['工号','姓名']]
dff.drop_duplicates()
'''
   工号  姓名
0  1001  张三
1  1002  李四
2  1003  王五
3  1004  赵六
4  1005  周七
5  1006  钱八
'''

# 数据差分
# 查看员工业绩波动情况(每一天和昨天的数据作比较)
dff = dataframe.groupby(by = '日期').sum()['交易额'].diff()
'''
日期
20190301       NaN
20190302    1765.0
20190303   -9690.0
Name: 交易额, dtype: float64
'''
# [:5] dataframe.head()
dff.map(lambda num:'%.2f'%(num))[:5]
'''
日期
20190301         nan
20190302     1765.00
20190303    -9690.00
Name: 交易额, dtype: object
'''
# 查看张三的波动情况
dataframe[dataframe.姓名 == '张三'].groupby(by = '日期').sum()['交易额'].diff()[:5]
'''
日期
20190301      NaN
20190302    850.0
20190303   -900.0
Name: 交易额, dtype: float64
'''


# 使用透视表与交叉表查看业绩汇总数据
import pandas as pd
import numpy as np
import copy

# 设置列对齐
pd.set_option("display.unicode.ambiguous_as_wide",True)
pd.set_option("display.unicode.east_asian_width",True)

dataframe = pd.read_excel(r'C:\Users\lenovo\Desktop\总结\Python\超市营业额.xlsx')
# 对姓名和日期进行分组,并进行求和
dff = dataframe.groupby(by = ['姓名','日期'],as_index = False).sum()
'''
    姓名      日期  工号  交易额
0   周七  20190301  1005     600
1   周七  20190302  1005     580
2   张三  20190301  1001    2000
3   张三  20190302  2002    1900
4   张三  20190303  1001    1300
5   李四  20190301  1002    1800
6   李四  20190302  2004    2180
7   王五  20190301  1003     800
8   王五  20190302  2006    1830
9   赵六  20190301  1004    1100
10  赵六  20190302  1004    1050
11  钱八  20190301  2012    1550
12  钱八  20190302  1006     720
'''
# 将 dff 的索引,列 设置成透视表形式
dff = dff.pivot(index = '姓名',columns = '日期',values = '交易额')
'''
日期  20190301  20190302  20190303
姓名                              
周七     600.0     580.0       NaN
张三    2000.0    1900.0    1300.0
李四    1800.0    2180.0       NaN
王五     800.0    1830.0       NaN
赵六    1100.0    1050.0       NaN
钱八    1550.0     720.0       NaN
'''
# 查看前一天的数据
dff.iloc[:,:1]
'''
日期  20190301
姓名          
周七     600.0
张三    2000.0
李四    1800.0
王五     800.0
赵六    1100.0
钱八    1550.0
'''
# 交易总额小于 4000 的人的前三天业绩
dff[dff.sum(axis = 1) < 4000].iloc[:,:3]
'''
日期  20190301  20190302  20190303
姓名                              
周七     600.0     580.0       NaN
李四    1800.0    2180.0       NaN
王五     800.0    1830.0       NaN
赵六    1100.0    1050.0       NaN
钱八    1550.0     720.0       NaN
'''
# 工资总额大于 2900 元的员工的姓名
dff[dff.sum(axis = 1) > 2900].index.values
# array(['张三', '李四'], dtype=object)

# 显示前两天每一天的交易总额以及每个人的交易金额
dataframe.pivot_table(values = '交易额',index = '姓名',columns = '日期',aggfunc = 'sum',margins = True).iloc[:,:2]
'''
日期  20190301  20190302
姓名                    
周七     600.0     580.0
张三    2000.0    1900.0
李四    1800.0    2180.0
王五     800.0    1830.0
赵六    1100.0    1050.0
钱八    1550.0     720.0
All     7850.0    8260.0
'''
# 显示每个人在每个柜台的交易总额
dff = dataframe.groupby(by = ['姓名','柜台'],as_index = False).sum()
dff.pivot(index = '姓名',columns = '柜台',values = '交易额')
'''
柜台  化妆品  日用品  蔬菜水果    食品
姓名                                  
周七     NaN  1180.0       NaN     NaN
张三  4600.0     NaN     600.0     NaN
李四  3300.0     NaN     680.0     NaN
王五     NaN     NaN     830.0  1800.0
赵六     NaN     NaN       NaN  2150.0
钱八     NaN  1420.0     850.0     NaN
'''
# 查看每人每天的上班次数
dataframe.pivot_table(values = '交易额',index = '姓名',columns = '日期',aggfunc = 'count',margins = True).iloc[:,:1]
'''
日期  20190301
姓名          
周七       1.0
张三       1.0
李四       1.0
王五       1.0
赵六       1.0
钱八       2.0
All        7.0
'''
# 查看每个人每天购买的次数
dataframe.pivot_table(values = '交易额',index = '姓名',columns = '日期',aggfunc = 'count',margins = True)
'''
日期  20190301  20190302  20190303  All
姓名                                   
周七       1.0       1.0       NaN    2
张三       1.0       2.0       1.0    4
李四       1.0       2.0       NaN    3
王五       1.0       2.0       NaN    3
赵六       1.0       1.0       NaN    2
钱八       2.0       1.0       NaN    3
All        7.0       9.0       1.0   17
'''
# 交叉表
# 每个人每天上过几次班
pd.crosstab(dataframe.姓名,dataframe.日期,margins = True).iloc[:,:2]
'''
日期  20190301  20190302
姓名                    
周七         1         1
张三         1         2
李四         1         2
王五         1         2
赵六         1         1
钱八         2         1
All          7         9
'''
# 每个人每天去过几次柜台
pd.crosstab(dataframe.姓名,dataframe.柜台)
'''
柜台  化妆品  日用品  蔬菜水果  食品
姓名                                
周七       0       2         0     0
张三       3       0         1     0
李四       2       0         1     0
王五       0       0         1     2
赵六       0       0         0     2
钱八       0       2         1     0
'''
# 将每一个人在每一个柜台的交易总额显示出来
pd.crosstab(dataframe.姓名,dataframe.柜台,dataframe.交易额,aggfunc='sum')
'''
柜台  化妆品  日用品  蔬菜水果    食品
姓名                                  
周七     NaN  1180.0       NaN     NaN
张三  4600.0     NaN     600.0     NaN
李四  3300.0     NaN     680.0     NaN
王五     NaN     NaN     830.0  1800.0
赵六     NaN     NaN       NaN  2150.0
钱八     NaN  1420.0     850.0     NaN
'''
# 每个人在每个柜台交易额的平均值,金额/天数
pd.crosstab(dataframe.姓名,dataframe.柜台,dataframe.交易额,aggfunc = 'mean').apply(lambda  num:round(num,2) )
'''
柜台   化妆品  日用品  蔬菜水果    食品
姓名                                   
周七      NaN   590.0       NaN     NaN
张三  1533.33     NaN     600.0     NaN
李四  1650.00     NaN     680.0     NaN
王五      NaN     NaN     830.0   900.0
赵六      NaN     NaN       NaN  1075.0
钱八      NaN   710.0     850.0     NaN
'''


# 重采样 多索引 标准差 协方差
import pandas as pd
import numpy as np
import copy

# 设置列对齐
pd.set_option("display.unicode.ambiguous_as_wide",True)
pd.set_option("display.unicode.east_asian_width",True)

data = pd.read_excel(r'C:\Users\lenovo\Desktop\总结\Python\超市营业额.xlsx')

# 将日期设置为 python 中的日期类型
data.日期 = pd.to_datetime(data.日期)
'''
   工号  姓名                          日期         时段  交易额    柜台
0  1001  张三 1970-01-01 00:00:00.020190301   9:00-14:00    2000  化妆品
1  1002  李四 1970-01-01 00:00:00.020190301  14:00-21:00    1800  化妆品
2  1003  王五 1970-01-01 00:00:00.020190301   9:00-14:00     800    食品
'''
# 每七天营业的总额
data.resample('7D',on = '日期').sum()['交易额']
'''
日期
1970-01-01    17410
Freq: 7D, Name: 交易额, dtype: int64
'''
# 每七天营业总额
data.resample('7D',on = '日期',label = 'right').sum()['交易额']
'''
日期
1970-01-08    17410
Freq: 7D, Name: 交易额, dtype: int64
'''
# 每七天营业额的平均值
func = lambda item:round(np.sum(item)/len(item),2)
data.resample('7D',on = '日期',label = 'right').apply(func)['交易额']
'''
日期
1970-01-08    1024.12
Freq: 7D, Name: 交易额, dtype: float64
'''
# 每七天营业额的平均值
func = lambda num:round(num,2)
data.resample('7D',on = '日期',label = 'right').mean().apply(func)['交易额']
# 1024.12

# 删除工号这一列
data.drop('工号',axis = 1,inplace = True)
data[:2]
'''
   姓名                          日期         时段  交易额    柜台
0  张三 1970-01-01 00:00:00.020190301   9:00-14:00    2000  化妆品
1  李四 1970-01-01 00:00:00.020190301  14:00-21:00    1800  化妆品
'''
# 按照姓名和柜台进行分组汇总
data = data.groupby(by = ['姓名','柜台']).sum()[:3]
'''
               交易额
姓名 柜台            
周七 日用品      1180
张三 化妆品      4600
     蔬菜水果     600
'''
# 查看张三的汇总数据
data.loc['张三',:]
'''
          交易额
柜台            
化妆品      4600
蔬菜水果     600
'''
# 查看张三在蔬菜水果的交易数据
data.loc['张三','蔬菜水果']
'''
交易额    600
Name: (张三, 蔬菜水果), dtype: int64
'''
# 多索引
# 重新读取,使用第二列和第六列作为索引,排在前面
data = pd.read_excel(r'C:\Users\lenovo\Desktop\总结\Python\超市营业额.xlsx',index_col = [1,5])
data[:5]
'''
             工号      日期         时段  交易额
姓名 柜台                                       
张三 化妆品  1001  20190301   9:00-14:00    2000
李四 化妆品  1002  20190301  14:00-21:00    1800
王五 食品    1003  20190301   9:00-14:00     800
赵六 食品    1004  20190301  14:00-21:00    1100
周七 日用品  1005  20190301   9:00-14:00     600
'''
# 丢弃工号列
data.drop('工号',axis = 1,inplace = True)
data[:5]
'''
             日期         时段  交易额
姓名 柜台                                 
张三 化妆品  20190301   9:00-14:00    2000
李四 化妆品  20190301  14:00-21:00    1800
王五 食品    20190301   9:00-14:00     800
赵六 食品    20190301  14:00-21:00    1100
周七 日用品  20190301   9:00-14:00     600
'''
# 按照柜台进行排序
dff = data.sort_index(level = '柜台',axis = 0)
dff[:5]
'''
             工号      日期         时段  交易额
姓名 柜台                                       
张三 化妆品  1001  20190301   9:00-14:00    2000
     化妆品  1001  20190302   9:00-14:00    1300
     化妆品  1001  20190303   9:00-14:00    1300
李四 化妆品  1002  20190301  14:00-21:00    1800
     化妆品  1002  20190302  14:00-21:00    1500
'''
# 按照姓名进行排序
dff = data.sort_index(level = '姓名',axis = 0)
dff[:5]
'''
             工号      日期        时段  交易额
姓名 柜台                                      
周七 日用品  1005  20190301  9:00-14:00     600
     日用品  1005  20190302  9:00-14:00     580
张三 化妆品  1001  20190301  9:00-14:00    2000
     化妆品  1001  20190302  9:00-14:00    1300
     化妆品  1001  20190303  9:00-14:00    1300
'''
# 按照柜台进行分组求和
dff = data.groupby(level = '柜台').sum()['交易额']
'''
柜台
化妆品      7900
日用品      2600
蔬菜水果    2960
食品        3950
Name: 交易额, dtype: int64
'''
#标准差
data = pd.DataFrame({'A':[3,3,3,3,3],'B':[1,2,3,4,5],
                     'C':[-5,-4,1,4,5],'D':[-45,15,63,40,50]
                     })
'''
   A  B  C   D
0  3  1 -5 -45
1  3  2 -4  15
2  3  3  1  63
3  3  4  4  40
4  3  5  5  50
'''
# 平均值
data.mean()
'''
A     3.0
B     3.0
C     0.2
D    24.6
dtype: float64
'''
# 标准差
data.std()
'''
A     0.000000
B     1.581139
C     4.549725
D    42.700117
dtype: float64
'''
# 标准差的平方
data.std()**2
'''
A       0.0
B       2.5
C      20.7
D    1823.3
dtype: float64
'''
# 协方差
data.cov()
'''
     A      B       C        D
A  0.0   0.00    0.00     0.00
B  0.0   2.50    7.00    53.75
C  0.0   7.00   20.70   153.35
D  0.0  53.75  153.35  1823.30
'''
# 指定索引为 姓名,日期,时段,柜台,交易额
data = pd.read_excel(r'C:\Users\lenovo\Desktop\总结\Python\超市营业额.xlsx',
                     usecols = ['姓名','日期','时段','柜台','交易额'])
# 删除缺失值和重复值,inplace = True 直接丢弃
data.dropna(inplace = True)
data.drop_duplicates(inplace = True)

# 处理异常值
data.loc[data.交易额 < 200,'交易额'] = 200
data.loc[data.交易额 > 3000,'交易额'] = 3000

# 使用交叉表得到不同员工在不同柜台的交易额平均值
dff = pd.crosstab(data.姓名,data.柜台,data.交易额,aggfunc = 'mean')
dff[:5]
'''
柜台       化妆品  日用品  蔬菜水果    食品
姓名                                       
周七          NaN   590.0       NaN     NaN
张三  1533.333333     NaN     600.0     NaN
李四  1650.000000     NaN     680.0     NaN
王五          NaN     NaN     830.0   900.0
赵六          NaN     NaN       NaN  1075.0
'''
# 查看数据的标准差
dff.std()
'''
柜台
化妆品       82.495791
日用品       84.852814
蔬菜水果    120.277457
食品        123.743687
dtype: float64
'''
dff.cov()
'''
柜台           化妆品  日用品      蔬菜水果     食品
柜台                                                
化妆品    6805.555556     NaN   4666.666667      NaN
日用品            NaN  7200.0           NaN      NaN
蔬菜水果  4666.666667     NaN  14466.666667      NaN
食品              NaN     NaN           NaN  15312.5
'''

import pandas as pd
import copy

# 设置列对齐
pd.set_option("display.unicode.ambiguous_as_wide",True)
pd.set_option("display.unicode.east_asian_width",True)

data = pd.read_excel(r'C:\Users\lenovo\Desktop\总结\Python\超市营业额.xlsx',usecols = ['日期','交易额'])

dff = copy.deepcopy(data)
# 查看周几
dff['日期'] = pd.to_datetime(data['日期']).dt.weekday_name
'''
       日期  交易额
0  Thursday    2000
1  Thursday    1800
2  Thursday     800
'''
# 按照周几进行分组,查看交易的平均值
dff = dff.groupby('日期').mean().apply(round)
dff.index.name = '周几'
dff[:3]
'''
          交易额
周几            
Thursday  1024.0
'''
# dff = copy.deepcopy(data)
# 使用正则规则查看月份日期
# dff['日期'] = dff.日期.str.extract(r'(\d{4}-\d{2})')
# dff[:5]

# 按照日 进行分组查看交易的平均值 -1 表示倒数第一个
# data.groupby(data.日期.str.__getitem__(-1)).mean().apply(round)

# 查看日期尾数为 1 的数据
# data[data.日期.str.endswith('1')][:12]

# 查看日期尾数为 12 的交易数据,slice 为切片 (-2) 表示倒数两个
# data[data.日期.str.slice(-2) == '12']

# 查看日期中月份或天数包含 2  的交易数据
# data[data.日期.str.slice(-5).str.contains('2')][1:9]

import pandas as pd
import numpy as np

# 读取全部数据,使用默认索引
data = pd.read_excel(r'C:\Users\lenovo\Desktop\总结\Python\超市营业额.xlsx')

# 修改异常值
data.loc[data.交易额 > 3000,'交易额'] = 3000
data.loc[data.交易额 < 200,'交易额'] = 200

# 删除重复值
data.drop_duplicates(inplace = True)

# 填充缺失值
data['交易额'].fillna(data['交易额'].mean(),inplace = True)

# 使用交叉表得到每人在各柜台交易额的平均值
data_group = pd.crosstab(data.姓名,data.柜台,data.交易额,aggfunc = 'mean').apply(round)
# 绘制柱状图
data_group.plot(kind = 'bar')
# <matplotlib.axes._subplots.AxesSubplot object at 0x000001D681607888>


#  数据的合并
data1 = pd.read_excel(r'C:\Users\lenovo\Desktop\总结\Python\超市营业额.xlsx')
data2 = pd.read_excel(r'C:\Users\lenovo\Desktop\总结\Python\超市营业额.xlsx',sheet_name = 'Sheet2')
df1 = data1[:3]
'''
     工号  姓名        日期           时段   交易额   柜台
0  1001  张三  20190301   9:00-14:00  2000  化妆品
1  1002  李四  20190301  14:00-21:00  1800  化妆品
2  1003  王五  20190301   9:00-14:00   800   食品
'''
df2 = data2[:4]
'''
     工号  姓名        日期           时段   交易额    柜台
0  1006  钱八  20190301   9:00-14:00   850  蔬菜水果
1  1001  张三  20190302  14:00-21:00   600  蔬菜水果
2  1001  张三  20190302   9:00-14:00  1300   化妆品
3  1002  李四  20190302  14:00-21:00  1500   化妆品
'''
# 使用 concat 连接两个相同结构的 DataFrame 对象
df3 = pd.concat([df1,df2])
'''
     工号  姓名        日期           时段   交易额    柜台
0  1001  张三  20190301   9:00-14:00  2000   化妆品
1  1002  李四  20190301  14:00-21:00  1800   化妆品
2  1003  王五  20190301   9:00-14:00   800    食品
0  1006  钱八  20190301   9:00-14:00   850  蔬菜水果
1  1001  张三  20190302  14:00-21:00   600  蔬菜水果
2  1001  张三  20190302   9:00-14:00  1300   化妆品
3  1002  李四  20190302  14:00-21:00  1500   化妆品
'''
# 合并,忽略原来的索引 ignore_index
df4 = df3.append([df1,df2],ignore_index = True)
'''
      工号  姓名        日期           时段   交易额    柜台
0   1001  张三  20190301   9:00-14:00  2000   化妆品
1   1002  李四  20190301  14:00-21:00  1800   化妆品
2   1003  王五  20190301   9:00-14:00   800    食品
3   1006  钱八  20190301   9:00-14:00   850  蔬菜水果
4   1001  张三  20190302  14:00-21:00   600  蔬菜水果
5   1001  张三  20190302   9:00-14:00  1300   化妆品
6   1002  李四  20190302  14:00-21:00  1500   化妆品
7   1001  张三  20190301   9:00-14:00  2000   化妆品
8   1002  李四  20190301  14:00-21:00  1800   化妆品
9   1003  王五  20190301   9:00-14:00   800    食品
10  1006  钱八  20190301   9:00-14:00   850  蔬菜水果
11  1001  张三  20190302  14:00-21:00   600  蔬菜水果
12  1001  张三  20190302   9:00-14:00  1300   化妆品
13  1002  李四  20190302  14:00-21:00  1500   化妆品
'''
# 按照列进行拆分
df5 = df4.loc[:,['姓名','柜台','交易额']]
# 查看前五条数据
df5[:5]
'''
   姓名    柜台   交易额
0  张三   化妆品  2000
1  李四   化妆品  1800
2  王五    食品   800
3  钱八  蔬菜水果   850
4  张三  蔬菜水果   600
'''

# 合并 merge 、 join
# 按照工号进行合并,随机查看 3 条数据
rows = np.random.randint(0,len(df5),3)
pd.merge(df4,df5).iloc[rows,:]
'''
      工号  姓名        日期           时段   交易额   柜台
7   1002  李四  20190301  14:00-21:00  1800  化妆品
4   1002  李四  20190301  14:00-21:00  1800  化妆品
10  1003  王五  20190301   9:00-14:00   800   食品
'''
# 按照工号进行合并,指定其他同名列的后缀
pd.merge(df1,df2,on = '工号',suffixes = ['_x','_y']).iloc[:,:]
'''
     工号 姓名_x      日期_x         时段_x  ...      日期_y         时段_y 交易额_y  柜台_y
0  1001   张三  20190301   9:00-14:00  ...  20190302  14:00-21:00   600  蔬菜水果
1  1001   张三  20190301   9:00-14:00  ...  20190302   9:00-14:00  1300   化妆品
2  1002   李四  20190301  14:00-21:00  ...  20190302  14:00-21:00  1500   化妆品
'''
# 两个表都设置工号为索引 set_index
df2.set_index('工号').join(df3.set_index('工号'),lsuffix = '_x',rsuffix = '_y').iloc[:]
'''
     姓名_x      日期_x         时段_x  交易额_x  ...      日期_y         时段_y  交易额_y  柜台_y
工号                                       ...                                    
1001   张三  20190302  14:00-21:00    600  ...  20190301   9:00-14:00   2000   化妆品
1001   张三  20190302  14:00-21:00    600  ...  20190302  14:00-21:00    600  蔬菜水果
1001   张三  20190302  14:00-21:00    600  ...  20190302   9:00-14:00   1300   化妆品
1001   张三  20190302   9:00-14:00   1300  ...  20190301   9:00-14:00   2000   化妆品
1001   张三  20190302   9:00-14:00   1300  ...  20190302  14:00-21:00    600  蔬菜水果
1001   张三  20190302   9:00-14:00   1300  ...  20190302   9:00-14:00   1300   化妆品
1002   李四  20190302  14:00-21:00   1500  ...  20190301  14:00-21:00   1800   化妆品
1002   李四  20190302  14:00-21:00   1500  ...  20190302  14:00-21:00   1500   化妆品
1006   钱八  20190301   9:00-14:00    850  ...  20190301   9:00-14:00    850  蔬菜水果

'''

2020-05-03

posted @ 2020-05-03 12:45  CodeYaSuo  阅读(332)  评论(0编辑  收藏  举报