[TechieProject] Validate the days_since_prior_order column in orders table

老师关于project 1,2.1调取NaN那部分的内容,我有一下三个问题。

  1. print("order_number 1 count in orders table: ", orders[orders.order_number == 1].drop_duplicates().shape[0])
    我的理解是你先indexing orders这个df里面order number那一列,去重order_number==1的boolean为true的数据,输出它去重的行数
    那我可不可以直接orders[orders.order_number == 1].shape[0])?直接调出order number为1的数据看总共有多少行?它的运行结果和有drop_duplicates()是一样的。
  2. print("NaN count in days_since_prior_order column: ", orders[orders.days_since_prior_order.isnull()].shape[0])
    如果写成orders[orders.days_since_prior_order== ‘NaN’].shape[0]) 输出结果是o; 如果orders.days_since_prior_order.isnull().shape[0]) 输出结果是82683(也就是total order number)
    老师能不能解释一下为什么会输出的结果不一样吗?
  3. print("user_id count in orders table: ", orders.user_id.drop_duplicates().shape[0])
    我自己用indexing的方法写了orders[‘user_id’].drop_duplicates().shape[0])得到的也是5000.
    第三个问题其实和第二个问题相同,我对什么时候df可以直接.column.function vs 什么时候要先indexing再.function有些混淆。
    谢谢老师。
  1. 不做 drop_duplicates() 在咱们的project中是可以的。我这边之所以加上这个操作,是为了避免数据中有重复数据而对咱们的计算结果有影响,相当于是一个double confirm. 由于咱们数据中并没有重复数据行,因此这个操作是没有影响的。但是在实际工作或者同学们未来面试OA中,有可能会有”重复数据“这种陷阱。
  2. 在python numpy / pandas 里面, NaN 是一个 default missing value marker,它并不是一个字符串。如果你看它的数据类型,你会发现它是float类型的数据。对它的判断最好使用专门的函数(pandas.isnull — pandas 1.4.1 documentation) 你写的 == “NaN” 是字符串比较,这种做法无法做到NaN的value check.
  3. 这个问题和第二个问题应该没什么关系? 我们选择dataframe column有很多方法,用函数方法 order.user_id 或者 index方法 order[‘user_id’] 都可以,两者应该没有任何区别。

谢谢老师的答疑。