• 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:UserslenovoDesktop总结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:UserslenovoDesktop总结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:UserslenovoDesktop总结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:UserslenovoDesktop总结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:UserslenovoDesktop总结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:UserslenovoDesktop总结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:UserslenovoDesktop总结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:UserslenovoDesktop总结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:UserslenovoDesktop总结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:UserslenovoDesktop总结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:UserslenovoDesktop总结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:UserslenovoDesktop总结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:UserslenovoDesktop总结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:UserslenovoDesktop总结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:UserslenovoDesktop总结Python超市营业额.xlsx')
    data2 = pd.read_excel(r'C:UserslenovoDesktop总结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

  • 相关阅读:
    C# 读取sqlite文件
    MongoDB聚合管道
    提取Word里的文本内容 C#
    Two Sum【LeetCode】
    Could not create SSL/TLS secure channel.
    处理Task引发的异常
    https请求抛出异常
    hexo+github page +markdown问题汇总
    通过自定义比较器排序(C#版)
    GridView固定行宽,自动换行,鼠标放在Table的Tr上变色
  • 原文地址:https://www.cnblogs.com/hany-postq473111315/p/12821512.html
Copyright © 2020-2023  润新知