目录
一、筛选
(一)索引的运用
(二)条件筛选
1.与:&
2.或:|
3.非:!=、~
(三)与常用函数结合
1.isin:
2.query:
3.contains:
二、排序
(一)修改列排序
1.df=df['new_column1','new_column2',...]:
2.df.insert(index, 'column_name', df.pop('column')):
3.reindex:
(二)行的排序
1.索引:df.sort_index(axis=0,ascending=False)
2.值:
笔记:几个基本数据结构——Ndarray、Series和Dataframe_带带琪宝的博客-CSDN博客
索引主要用于行列的筛选,在之前的一篇文章中有涉及到DataFrame的切片和筛选,在文章里面 DataFrame 的索引部分,
用最简单的例子看一下运用布尔索引筛选数据的原理:FALSE将不输出,若同时对行和列进行筛选,使用 df.loc[index 筛选条件,columns 筛选条件],先行后列
print(data2['门店号'] == 1001)
print(data2[(data2['门店号'] == 1001)])
0 True
1 False
2 False
...
4265 False
4266 False
4267 False
Name: 门店号, Length: 4268, dtype: bool
日期 星期 门店号 码洋 天气 ... 客流量 客单数 交易数量 月份 门店
0 2023-01-31 二 1001 8105.611548 NaN ... 1577 859 2004 1 龙华店
36 2023-01-30 一 1001 7008.441083 NaN ... 1722 683 2444 1 龙华店
72 2023-01-29 日 1001 6386.655611 NaN ... 1160 768 2186 1 龙华店
... ... .. ... ... ... ... ... ... ... .. ...
4160 2023-04-03 一 1001 8766.757345 NaN ... 1074 837 1536 4 龙华店
4196 2023-04-02 日 1001 5313.663658 NaN ... 1334 783 2549 4 龙华店
4232 2023-04-01 六 1001 4538.680685 NaN ... 1918 685 2780 4 龙华店
[120 rows x 11 columns]
如筛选出客流量大于500且成交率大于0.5的日期
print(data2.head(3))
df1=(data2[(data2['客流量'] > 500) & (data2['客单数']/data2['客流量'] >= 0.5)])
df2=(data2.loc[(data2['客流量'] > 500) & (data2['客单数']/data2['客流量'] >= 0.5), ['日期']])
print(df1.index)
print(df2)
日期 星期 门店号 码洋 天气 实洋 客流量 客单数 交易数量 月份 门店
0 2023-01-31 二 1001 8105.611548 NaN 8105.611548 1577 859 2004 1 龙华店
1 2023-01-31 二 1002 8117.412956 NaN 8117.412956 1392 752 1462 1 石岩店
2 2023-01-31 二 1003 9369.565960 NaN 9369.565960 1661 949 1258 1 观澜店
Index([ 0, 1, 2, 4, 5, 6, 9, 10, 12, 14,
...
4252, 4254, 4255, 4256, 4257, 4258, 4259, 4261, 4262, 4266],
dtype='int64', length=2145)
日期
0 2023-01-31
1 2023-01-31
2 2023-01-31
4 2023-01-31
5 2023-01-31
... ...
4258 2023-04-01
4259 2023-04-01
4261 2023-04-01
4262 2023-04-01
4266 2023-04-01
[2145 rows x 1 columns]
如筛选出客流量大于1500或客单数大于800的日期
print(len(data2))
df=(data2.loc[(data2['客流量'] > 1500) | (data2['客单数'] > 800), ['日期']])
print(df.index)
4268
Index([ 0, 2, 3, 4, 6, 9, 10, 11, 13, 14,
...
4256, 4257, 4258, 4259, 4260, 4261, 4262, 4265, 4266, 4267],
dtype='int64', length=2996)
在筛选条件较多时可以取非
print(data2.head(3))
print(data2[data2['门店号'] != 1001].index)
日期 星期 门店号 码洋 天气 实洋 客流量 客单数 交易数量 月份 门店
0 2023-01-31 二 1001 8105.611548 NaN 8105.611548 1577 859 2004 1 龙华店
1 2023-01-31 二 1002 8117.412956 NaN 8117.412956 1392 752 1462 1 石岩店
2 2023-01-31 二 1003 9369.565960 NaN 9369.565960 1661 949 1258 1 观澜店
Index([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
...
4258, 4259, 4260, 4261, 4262, 4263, 4264, 4265, 4266, 4267],
dtype='int64', length=4148)
df[df['column'].isin([ list ])] ,注意 isin 进行的是精确匹配而不是模糊匹配,可以将多个数值范围要求或字段要求通过列表的形式传入函数中进行筛选。
print(data2.head(3))
df = data2[data2['门店号'].isin(range(1001,1005))]
print(df)
日期 星期 门店号 码洋 天气 实洋 客流量 客单数 交易数量 月份 门店
0 2023-01-31 二 1001 8105.611548 NaN 8105.611548 1577 859 2004 1 龙华店
1 2023-01-31 二 1002 8117.412956 NaN 8117.412956 1392 752 1462 1 石岩店
2 2023-01-31 二 1003 9369.565960 NaN 9369.565960 1661 949 1258 1 观澜店
日期 星期 门店号 码洋 天气 ... 客流量 客单数 交易数量 月份 门店
0 2023-01-31 二 1001 8105.611548 NaN ... 1577 859 2004 1 龙华店
1 2023-01-31 二 1002 8117.412956 NaN ... 1392 752 1462 1 石岩店
36 2023-01-30 一 1001 7008.441083 NaN ... 1722 683 2444 1 龙华店
... ... .. ... ... ... ... ... ... ... .. ...
4197 2023-04-02 日 1002 3912.713637 NaN ... 1185 764 2917 4 石岩店
4232 2023-04-01 六 1001 4538.680685 NaN ... 1918 685 2780 4 龙华店
4233 2023-04-01 六 1002 4003.336703 NaN ... 1580 557 2403 4 石岩店
[240 rows x 11 columns]
可以使用 ~ 号取反
df = data2[~data2['门店号'].isin(range(1001,1003))]
print(df)
日期 星期 门店号 码洋 天气 ... 客流量 客单数 交易数量 月份 门店
2 2023-01-31 二 1003 9369.565960 NaN ... 1661 949 1258 1 观澜店
3 2023-01-31 二 1004 2778.225608 NaN ... 1997 748 795 1 香蜜湖店
4 2023-01-31 二 1006 9961.178449 NaN ... 1290 968 2537 1 公明店
... ... .. ... ... ... ... ... ... ... .. ...
4265 2023-04-01 六 3008 383.240643 NaN ... 1591 649 1363 4 惠州店
4266 2023-04-01 六 3009 5739.039035 NaN ... 1443 901 2294 4 佛山店
4267 2023-04-01 六 3010 9178.243621 NaN ... 1975 663 2122 4 福州店
[4028 rows x 11 columns]
query( ' expression ' ) :expression为字符串表达式,表示筛选的条件,可以结合前面的且、或、非使用,当标签有空格时,要再用反引号括起来,函数返回一个DataFrame,可以直接在后面根据索引获取最终想要的数据
现在有两类门店,我想查看两类门店的日期、门店、客流量几列数据,可以通过列表作为变量赋值
warehouse_list1=[1001,1002]
warehouse_list2=[3008,3009]
df=data2.query('门店号 in @warehouse_list1 | 门店号 in @warehouse_list2',inplace=False)[['日期','门店号','客流量']]
print(df)
# 由于有行和列,所以里面的[ ]是列数组,外面的[ ]是dataframe的行列值
日期 门店号 客流量
0 2023-01-31 1001 1577
1 2023-01-31 1002 1392
33 2023-01-31 3008 1869
... ... ... ...
4233 2023-04-01 1002 1580
4265 2023-04-01 3008 1591
4266 2023-04-01 3009 1443
语法:df.str.contains(pat, case=True, na=None, regex=True)
pat:可以为字符串或正则表达式,用哪种方式查找
case:是否区分大小写
na:用来替换缺失值的,默认对空值不处理,即输出结果为 NaN
regex:即第一个参数,是否使用正则表达式的规则。
df.contains() 类似SQL里面的like,进行模糊查找,只能对字符类型的数据进行查找,比如我想找编号开头为 '30' 的店,需先转换数据类型,找到后再进行输出
print(data2.tail(3))
print(data2['门店号'].astype('str').str.contains('30')) # 输出的行
print(data2[data2['门店号'].astype('str').str.contains('30')].index) # 这些行的索引
日期 星期 门店号 码洋 天气 ... 客流量 客单数 交易数量 月份 门店
4265 2023-04-01 六 3008 383.240643 NaN ... 1591 649 1363 4 惠州店
4266 2023-04-01 六 3009 5739.039035 NaN ... 1443 901 2294 4 佛山店
4267 2023-04-01 六 3010 9178.243621 NaN ... 1975 663 2122 4 福州店
0 False
1 False
2 False
...
4265 True
4266 True
4267 True
Name: 门店号, Length: 4268, dtype: bool
Index([ 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
...
4258, 4259, 4260, 4261, 4262, 4263, 4264, 4265, 4266, 4267],
dtype='int64', length=1193)
除 contains 外,对于字符列的模糊查询还有 startwith、endwith等方式
筛选方法和函数可以根据不同的需要被搭配在一起形成多重的条件筛选
这是最简单的方法,直接重新定义列名
print(data2.columns)
l=['日期', '月份', '星期', '门店号', '门店', '天气', '码洋', '实洋', '客流量', '客单数', '交易数量']
df=data2[l]
print(df.columns)
Index(['日期', '星期', '门店号', '码洋', '天气', '实洋', '客流量', '客单数', '交易数量', '月份', '门店'], dtype='object')
Index(['日期', '月份', '星期', '门店号', '门店', '天气', '码洋', '实洋', '客流量', '客单数', '交易数量'], dtype='object')
意思是将月份删除,插入第二列
print(data2.columns)
data2.insert(1,'月份',data2.pop('月份'))
print(data2.columns)
Index(['日期', '星期', '门店号', '码洋', '天气', '实洋', '客流量', '客单数', '交易数量', '月份', '门店'], dtype='object')
Index(['日期', '月份', '星期', '门店号', '码洋', '天气', '实洋', '客流量', '客单数', '交易数量', '门店'], dtype='object')
reindex 可以重排列名,但其内容不改变
sort_index 可以根据索引排序,索引排序主要对于在如日期、ID等作为索引的情况下使用较为方便
axis:参数指定对行索引排序还是对列索引排序,默认0,表示对行索引排序,1表示对列索引进行排序
ascending:参数指定升序还是降序,默认为True表示升序,设置为False表示降序
df=data2.sort_index(ascending=False)
print(df)
日期 星期 门店号 码洋 天气 ... 客流量 客单数 交易数量 月份 门店
4267 2023-04-01 六 3010 9178.243621 NaN ... 1975 663 2122 4 福州店
4266 2023-04-01 六 3009 5739.039035 NaN ... 1443 901 2294 4 佛山店
4265 2023-04-01 六 3008 383.240643 NaN ... 1591 649 1363 4 惠州店
... ... .. ... ... ... ... ... ... ... .. ...
2 2023-01-31 二 1003 9369.565960 NaN ... 1661 949 1258 1 观澜店
1 2023-01-31 二 1002 8117.412956 NaN ... 1392 752 1462 1 石岩店
0 2023-01-31 二 1001 8105.611548 NaN ... 1577 859 2004 1 龙华店
(1)df.sort_values(by=[column1,column2],ascending=[False,True],kind):
by:要排序的列
ascending:意为提升,通过该参数可以设置排序是按升序还是降序
kind:排序方式,有 mergesort 归并排序,heapsort 堆排序和quicksort 快速排序等
比如,按日期升序,客流量降序对数据排序并提取,可以使用该方法,会先对 column1进行排序,随后对 column2 进行排序
df=data2.sort_values(by=['日期','客流量'],ascending=[True,False])[['日期','客流量']]
print(df)
日期 客流量
1028 2023-01-01 1988
1037 2023-01-01 1980
1041 2023-01-01 1971
... ... ...
3205 2023-04-30 1118
3211 2023-04-30 1084
3193 2023-04-30 1012
如果数据是 str 类型,则是按照字符编码排序。如果数据内容有汉字,则涉及字符的编码和解码,可使用 'x'.ecoding 可以查看对应的编码。
(2)df.rank():
中国式排序,用法详见https://blog.csdn.net/fullbug/article/details/122750105