# 一维数组与常用操作 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