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

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]

1.与:&

        如筛选出客流量大于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]

2.或:|

        如筛选出客流量大于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)

3.非:!=、~

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

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)

(三)与常用函数结合

1.isin:

        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]

2.query:

        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

3.contains:

语法: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等方式
        筛选方法和函数可以根据不同的需要被搭配在一起形成多重的条件筛选

二、排序

(一)修改列排序

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

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

print(data2.columns)
l=['日期', '月份', '星期', '门店号', '门店', '天气', '码洋', '实洋', '客流量', '客单数', '交易数量']
df=data2[l]
print(df.columns)

Index(['日期', '星期', '门店号', '码洋', '天气', '实洋', '客流量', '客单数', '交易数量', '月份', '门店'], dtype='object')
Index(['日期', '月份', '星期', '门店号', '门店', '天气', '码洋', '实洋', '客流量', '客单数', '交易数量'], dtype='object')

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

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

print(data2.columns)
data2.insert(1,'月份',data2.pop('月份'))
print(data2.columns)

Index(['日期', '星期', '门店号', '码洋', '天气', '实洋', '客流量', '客单数', '交易数量', '月份', '门店'], dtype='object')
Index(['日期', '月份', '星期', '门店号', '码洋', '天气', '实洋', '客流量', '客单数', '交易数量', '门店'], dtype='object')

3.reindex:

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

(二)行的排序

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

        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   龙华店

2.值:

(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

你可能感兴趣的:(pandas,python,开发语言)