当前位置:   article > 正文

DataFrame数据的筛选和排序_dataframe 筛选

dataframe 筛选

目录

一、筛选

(一)索引的运用

(二)条件筛选

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 筛选条件],先行后列

  1. print(data2['门店号'] == 1001)
  2. print(data2[(data2['门店号'] == 1001)])
  3. 0 True
  4. 1 False
  5. 2 False
  6. ...
  7. 4265 False
  8. 4266 False
  9. 4267 False
  10. Name: 门店号, Length: 4268, dtype: bool
  11. 日期 星期 门店号 码洋 天气 ... 客流量 客单数 交易数量 月份 门店
  12. 0 2023-01-311001 8105.611548 NaN ... 1577 859 2004 1 龙华店
  13. 36 2023-01-301001 7008.441083 NaN ... 1722 683 2444 1 龙华店
  14. 72 2023-01-291001 6386.655611 NaN ... 1160 768 2186 1 龙华店
  15. ... ... .. ... ... ... ... ... ... ... .. ...
  16. 4160 2023-04-03 一 1001 8766.757345 NaN ... 1074 837 1536 4 龙华店
  17. 4196 2023-04-02 日 1001 5313.663658 NaN ... 1334 783 2549 4 龙华店
  18. 4232 2023-04-01 六 1001 4538.680685 NaN ... 1918 685 2780 4 龙华店
  19. [120 rows x 11 columns]

1.与:&

        如筛选出客流量大于500且成交率大于0.5的日期

  1. print(data2.head(3))
  2. df1=(data2[(data2['客流量'] > 500) & (data2['客单数']/data2['客流量'] >= 0.5)])
  3. df2=(data2.loc[(data2['客流量'] > 500) & (data2['客单数']/data2['客流量'] >= 0.5), ['日期']])
  4. print(df1.index)
  5. print(df2)
  6. 日期 星期 门店号 码洋 天气 实洋 客流量 客单数 交易数量 月份 门店
  7. 0 2023-01-311001 8105.611548 NaN 8105.611548 1577 859 2004 1 龙华店
  8. 1 2023-01-311002 8117.412956 NaN 8117.412956 1392 752 1462 1 石岩店
  9. 2 2023-01-311003 9369.565960 NaN 9369.565960 1661 949 1258 1 观澜店
  10. Index([ 0, 1, 2, 4, 5, 6, 9, 10, 12, 14,
  11. ...
  12. 4252, 4254, 4255, 4256, 4257, 4258, 4259, 4261, 4262, 4266],
  13. dtype='int64', length=2145)
  14. 日期
  15. 0 2023-01-31
  16. 1 2023-01-31
  17. 2 2023-01-31
  18. 4 2023-01-31
  19. 5 2023-01-31
  20. ... ...
  21. 4258 2023-04-01
  22. 4259 2023-04-01
  23. 4261 2023-04-01
  24. 4262 2023-04-01
  25. 4266 2023-04-01
  26. [2145 rows x 1 columns]

2.或:|

        如筛选出客流量大于1500或客单数大于800的日期

  1. print(len(data2))
  2. df=(data2.loc[(data2['客流量'] > 1500) | (data2['客单数'] > 800), ['日期']])
  3. print(df.index)
  4. 4268
  5. Index([ 0, 2, 3, 4, 6, 9, 10, 11, 13, 14,
  6. ...
  7. 4256, 4257, 4258, 4259, 4260, 4261, 4262, 4265, 4266, 4267],
  8. dtype='int64', length=2996)

3.非:!=、~

        在筛选条件较多时可以取非

  1. print(data2.head(3))
  2. print(data2[data2['门店号'] != 1001].index)
  3. 日期 星期 门店号 码洋 天气 实洋 客流量 客单数 交易数量 月份 门店
  4. 0 2023-01-311001 8105.611548 NaN 8105.611548 1577 859 2004 1 龙华店
  5. 1 2023-01-311002 8117.412956 NaN 8117.412956 1392 752 1462 1 石岩店
  6. 2 2023-01-311003 9369.565960 NaN 9369.565960 1661 949 1258 1 观澜店
  7. Index([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
  8. ...
  9. 4258, 4259, 4260, 4261, 4262, 4263, 4264, 4265, 4266, 4267],
  10. dtype='int64', length=4148)

(三)与常用函数结合

1.isin:

        df[df['column'].isin([ list ])] ,注意 isin 进行的是精确匹配而不是模糊匹配,可以将多个数值范围要求或字段要求通过列表的形式传入函数中进行筛选。

  1. print(data2.head(3))
  2. df = data2[data2['门店号'].isin(range(1001,1005))]
  3. print(df)
  4. 日期 星期 门店号 码洋 天气 实洋 客流量 客单数 交易数量 月份 门店
  5. 0 2023-01-311001 8105.611548 NaN 8105.611548 1577 859 2004 1 龙华店
  6. 1 2023-01-311002 8117.412956 NaN 8117.412956 1392 752 1462 1 石岩店
  7. 2 2023-01-311003 9369.565960 NaN 9369.565960 1661 949 1258 1 观澜店
  8. 日期 星期 门店号 码洋 天气 ... 客流量 客单数 交易数量 月份 门店
  9. 0 2023-01-311001 8105.611548 NaN ... 1577 859 2004 1 龙华店
  10. 1 2023-01-311002 8117.412956 NaN ... 1392 752 1462 1 石岩店
  11. 36 2023-01-301001 7008.441083 NaN ... 1722 683 2444 1 龙华店
  12. ... ... .. ... ... ... ... ... ... ... .. ...
  13. 4197 2023-04-02 日 1002 3912.713637 NaN ... 1185 764 2917 4 石岩店
  14. 4232 2023-04-01 六 1001 4538.680685 NaN ... 1918 685 2780 4 龙华店
  15. 4233 2023-04-01 六 1002 4003.336703 NaN ... 1580 557 2403 4 石岩店
  16. [240 rows x 11 columns]

        可以使用 ~ 号取反

  1. df = data2[~data2['门店号'].isin(range(1001,1003))]
  2. print(df)
  3. 日期 星期 门店号 码洋 天气 ... 客流量 客单数 交易数量 月份 门店
  4. 2 2023-01-311003 9369.565960 NaN ... 1661 949 1258 1 观澜店
  5. 3 2023-01-311004 2778.225608 NaN ... 1997 748 795 1 香蜜湖店
  6. 4 2023-01-311006 9961.178449 NaN ... 1290 968 2537 1 公明店
  7. ... ... .. ... ... ... ... ... ... ... .. ...
  8. 4265 2023-04-01 六 3008 383.240643 NaN ... 1591 649 1363 4 惠州店
  9. 4266 2023-04-01 六 3009 5739.039035 NaN ... 1443 901 2294 4 佛山店
  10. 4267 2023-04-01 六 3010 9178.243621 NaN ... 1975 663 2122 4 福州店
  11. [4028 rows x 11 columns]

2.query:

        query( ' expression ' ) :expression为字符串表达式,表示筛选的条件,可以结合前面的且、或、非使用,当标签有空格时,要再用反引号括起来,函数返回一个DataFrame,可以直接在后面根据索引获取最终想要的数据

        现在有两类门店,我想查看两类门店的日期、门店、客流量几列数据,可以通过列表作为变量赋值

  1. warehouse_list1=[1001,1002]
  2. warehouse_list2=[3008,3009]
  3. df=data2.query('门店号 in @warehouse_list1 | 门店号 in @warehouse_list2',inplace=False)[['日期','门店号','客流量']]
  4. print(df)
  5. # 由于有行和列,所以里面的[ ]是列数组,外面的[ ]是dataframe的行列值
  6. 日期 门店号 客流量
  7. 0 2023-01-31 1001 1577
  8. 1 2023-01-31 1002 1392
  9. 33 2023-01-31 3008 1869
  10. ... ... ... ...
  11. 4233 2023-04-01 1002 1580
  12. 4265 2023-04-01 3008 1591
  13. 4266 2023-04-01 3009 1443

3.contains:

语法:df.str.contains(pat, case=True, na=None, regex=True)

pat:可以为字符串或正则表达式,用哪种方式查找

case:是否区分大小写

na:用来替换缺失值的,默认对空值不处理,即输出结果为 NaN

regex:即第一个参数,是否使用正则表达式的规则。

        df.contains() 类似SQL里面的like,进行模糊查找,只能对字符类型的数据进行查找,比如我想找编号开头为 '30' 的店,需先转换数据类型,找到后再进行输出

  1. print(data2.tail(3))
  2. print(data2['门店号'].astype('str').str.contains('30')) # 输出的行
  3. print(data2[data2['门店号'].astype('str').str.contains('30')].index) # 这些行的索引
  4. 日期 星期 门店号 码洋 天气 ... 客流量 客单数 交易数量 月份 门店
  5. 4265 2023-04-01 六 3008 383.240643 NaN ... 1591 649 1363 4 惠州店
  6. 4266 2023-04-01 六 3009 5739.039035 NaN ... 1443 901 2294 4 佛山店
  7. 4267 2023-04-01 六 3010 9178.243621 NaN ... 1975 663 2122 4 福州店
  8. 0 False
  9. 1 False
  10. 2 False
  11. ...
  12. 4265 True
  13. 4266 True
  14. 4267 True
  15. Name: 门店号, Length: 4268, dtype: bool
  16. Index([ 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
  17. ...
  18. 4258, 4259, 4260, 4261, 4262, 4263, 4264, 4265, 4266, 4267],
  19. dtype='int64', length=1193)

        除 contains 外,对于字符列的模糊查询还有 startwith、endwith等方式
        筛选方法和函数可以根据不同的需要被搭配在一起形成多重的条件筛选

二、排序

(一)修改列排序

1.df=df['new_column1','new_column2',...]:

        这是最简单的方法,直接重新定义列名

  1. print(data2.columns)
  2. l=['日期', '月份', '星期', '门店号', '门店', '天气', '码洋', '实洋', '客流量', '客单数', '交易数量']
  3. df=data2[l]
  4. print(df.columns)
  5. Index(['日期', '星期', '门店号', '码洋', '天气', '实洋', '客流量', '客单数', '交易数量', '月份', '门店'], dtype='object')
  6. Index(['日期', '月份', '星期', '门店号', '门店', '天气', '码洋', '实洋', '客流量', '客单数', '交易数量'], dtype='object')

2.df.insert(index, 'column_name', df.pop('column')):

        意思是将月份删除,插入第二列

  1. print(data2.columns)
  2. data2.insert(1,'月份',data2.pop('月份'))
  3. print(data2.columns)
  4. Index(['日期', '星期', '门店号', '码洋', '天气', '实洋', '客流量', '客单数', '交易数量', '月份', '门店'], dtype='object')
  5. Index(['日期', '月份', '星期', '门店号', '码洋', '天气', '实洋', '客流量', '客单数', '交易数量', '门店'], dtype='object')

3.reindex:

        reindex 可以重排列名,但其内容不改变

(二)行的排序

1.索引:df.sort_index(axis=0,ascending=False)

        sort_index 可以根据索引排序,索引排序主要对于在如日期、ID等作为索引的情况下使用较为方便

        axis:参数指定对行索引排序还是对列索引排序,默认0,表示对行索引排序,1表示对列索引进行排序

        ascending:参数指定升序还是降序,默认为True表示升序,设置为False表示降序

  1. df=data2.sort_index(ascending=False)
  2. print(df)
  3. 日期 星期 门店号 码洋 天气 ... 客流量 客单数 交易数量 月份 门店
  4. 4267 2023-04-01 六 3010 9178.243621 NaN ... 1975 663 2122 4 福州店
  5. 4266 2023-04-01 六 3009 5739.039035 NaN ... 1443 901 2294 4 佛山店
  6. 4265 2023-04-01 六 3008 383.240643 NaN ... 1591 649 1363 4 惠州店
  7. ... ... .. ... ... ... ... ... ... ... .. ...
  8. 2 2023-01-311003 9369.565960 NaN ... 1661 949 1258 1 观澜店
  9. 1 2023-01-311002 8117.412956 NaN ... 1392 752 1462 1 石岩店
  10. 0 2023-01-311001 8105.611548 NaN ... 1577 859 2004 1 龙华店

2.值:

(1)df.sort_values(by=[column1,column2],ascending=[False,True],kind):

by:要排序的列

ascending:意为提升,通过该参数可以设置排序是按升序还是降序

kind:排序方式,有 mergesort 归并排序,heapsort 堆排序和quicksort 快速排序等

         比如,按日期升序,客流量降序对数据排序并提取,可以使用该方法,会先对 column1进行排序,随后对 column2 进行排序

  1. df=data2.sort_values(by=['日期','客流量'],ascending=[True,False])[['日期','客流量']]
  2. print(df)
  3. 日期 客流量
  4. 1028 2023-01-01 1988
  5. 1037 2023-01-01 1980
  6. 1041 2023-01-01 1971
  7. ... ... ...
  8. 3205 2023-04-30 1118
  9. 3211 2023-04-30 1084
  10. 3193 2023-04-30 1012

        如果数据是 str 类型,则是按照字符编码排序。如果数据内容有汉字,则涉及字符的编码和解码,可使用 'x'.ecoding 可以查看对应的编码。

(2)df.rank():

        中国式排序,用法详见https://blog.csdn.net/fullbug/article/details/122750105

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/600968
推荐阅读
相关标签
  

闽ICP备14008679号