1. 程式人生 > >pandas的篩選功能,跟excel的篩選功能類似,但是功能更強大。

pandas的篩選功能,跟excel的篩選功能類似,但是功能更強大。

list stack indexing 一個 loop excel data creat imp

  Select rows from a DataFrame based on values in a column -pandas 篩選
  
  https://stackoverflow.com/questions/17071871/select-rows-from-a-dataframe-based-on-values-in-a-column-in-pandas
  
  pandas的篩選功能,跟excel的篩選功能類似,但是功能更強大。
  
  在SQL數據中, 我們可以用這樣的語句:
  
  select * from table where colume_name = some_value.
  
  1
  
  1
  
  bool 索引
  
  在Pandas的DataFrame格式中可以采用 bool 值作為索引,選取數據行。比如:
  
  import pandas as pd
  
  # Create data set
  
  d = {‘foo‘:[100, 111, 222],
  
  ‘bar‘:[333, 444, 555]}
  
  df = pd.DataFrame(d)
  
  # Full dataframe:
  
  df
  
  # Shows:
  
  # bar foo
  
  # 0 333 100
  
  # 1 444 111
  
  # 2 555 222
  
  # bool 值索引
  
  df[[True, False, True]] # 或 df.loc[[True, False, True]]
  
  # 都可以得到
  
  # bar foo
  
  #0 333 100
  
  #1 444 111
  
  所以,如果想通過數值來對行進行篩選,我們可以通過構造bool值來選擇DataFrame的行
  
  df[df[‘column_name‘] == some_value] 如果是數值型,也可以采用 >/<
  
  df[df[‘column_name‘].isin(some_values)] some_values 可以是單個變量,也可以是list 或者叠代器
  
  組合多種條件
  
  df[(df[‘column_name‘] == some_value) & df[‘other_column‘].isin(some_values)]
  
  df[(df[‘column_name‘] == some_value) | df[‘other_column‘].isin(some_values)]
  
  #註意,& | 的優先級很高,所以每個條件都需要一個括號
  
  不等於,可以使用
  
  df[~df[‘column_name‘].isin(some_values)]
  
  df[df[‘column_name‘] != some_value]
  
  np.where
  
  與上面所述的方法有所不同, np.where 返回的是行的位置,所以在獲取行時不能采用df, 要采用df.loc 或者 df.iloc
  
  np.where(df.A.values==‘foo‘)
  
  # (array([0, 2, 4, 6, 7]),)
  
  df.iloc[np.where(df.A.values==‘foo‘)]
  
  query
  
  DataFrame 提供了query函數,方便我們可以采用表達式來進行數據的篩選。
  
  參考:
  
  http://pandas.pydata.org/pandas-docs/version/0.17.0/indexing.html#indexing-query
  
  n = 10
  
  df = pd.DataFrame(np.random.randint(n, size=(n, 2)), columns=list(‘bc‘))
  
  # b c
  
  # 0 9 0
  
  # 1 1 2
  
  # 2 2 4
  
  # 3 7 6
  
  # 4 6 4
  
  # 5 4 7
  
  # 6 2 9
  
  # 7 4 8
  
  # 8 6 2
  
  # 9 9 0
  
  df.query(‘index > b > c‘)
  
  # b c
  
  # 8 6 2
  
  #可以采用的表達式很多,比如
  
  df.query(‘(a < b) & (b < c)‘)
  
  df.query(‘a < b and b < c‘)
  
  時間測評
  
  import pandas as pd
  
  df = pd.DataFrame({‘A‘: ‘foo bar foo bar foo bar foo foo‘.split(),
  
  ‘B‘: ‘one one two three two two one www.lieqibiji.com three‘.split()})
  
  df.iloc[np.where(df.A.values==‘foo‘)]
  
  %timeit df.iloc[np.where(df.A.values==‘foo‘)]
  
  #1000 loops, best of 3: www.caihonyule.com/ 274 μs per loop
  
  %timeit df.loc[np.where(df.A.values==‘foo‘)]
  
  #1000 loops, best of 3: 342 μs per loop
  
  %timeit df.loc[df[‘A‘] == ‘foo‘]
  
  #1000 loops, best of 3: 347 μs per loop
  
  %timeit df[df[‘A‘] == ‘foo‘]
  
  #1000 loops, best of 3: 354 www.feifanshifan8.cn μs per loop
  
  %timeit df.loc[df[‘A‘].isin([‘foo‘])]
  
  #1000 loops, best of 3: 265 μs per loop
  
  %timeit df[df.A==‘foo‘]
  
  #1000 loops, best of 3: 357 www.xingchexiu.com μs per loop
  
  %timeit df.query(‘(A=="www.qinlinyule.cn foo")‘)
  
  #1000 loops, best of 3: 943 μs per loop
  
  可以發現采用 df.iloc[np.where(df.A.values==‘foo‘)]和 df.loc[df[‘A‘].isin([‘foo‘])] 速度比較快, 而采用query的方法比較慢。
  
  df.loc[df[‘A‘] == ‘foo‘] 速度快於 df[df[‘A‘] == ‘foo‘]

pandas的篩選功能,跟excel的篩選功能類似,但是功能更強大。