基準

2016-11-17 6 views
10

に基づくPythonのパンダにおけるデータフレームの最初の行は、のは、私は元のテーブルにはより多くの列と行とのより複雑である。この1基準

import pandas as pd 
df = pd.DataFrame([[1, 2, 1], [1, 3, 2], [4, 6, 3], [4, 3, 4], [5, 4, 5]], columns=['A', 'B', 'C']) 

>> df 
    A B C 
0 1 2 1 
1 1 3 2 
2 4 6 3 
3 4 3 4 
4 5 4 5 

のようなデータフレームを持っているとしましょう取得します。

いくつかの基準を満たす最初の行を取得したいと考えています。例:

  1. はA> 3(戻る行2)
  2. はA> 4 AND B> 3(戻り列4)
  3. はA> 3最初の行を取得する最初の行を取得する最初の行を取得し、 (B> 3 OR C> 2)(行2を返す)

しかし、特定の条件を満たす行がない場合は、降順でソートした後に最初の列を取得したいA(またはB、Cなどによるその他のケース)

  1. (:P私はクラップスことを知っている)A> 6(DESCでそれを注文して、行4を返し、最初のものを得る)

は、私がデータフレームに反復することによってそれを行うことができた最初の行を取得します。だから、私はそれを解決するためにもっとpythonicな方法を好む。既存の一致を

+0

まず列A> 4はあなたが – Boud

+0

[ブールインデックス]探しているテストを確認することができます(http://pandas.pydata.org、4です/pandas-docs/stable/indexing.html#boolean-indexing)? – Kartik

+0

@Boud申し訳ありません。タイプエラー: – Tasos

答えて

13

This tutorialはパンダのスライスのために非常に良いものです...あなたがあれば試してみるか、ANで処理することができます戻ってきます。それを確認してください。

>>> df[condition] 

これはあなたがインデックスilocを使用することができ、あなたのデータフレームのスライスを返します。いくつかのスニペットに...条件付きデータフレームをスライスするには、この形式を使用します。ここにあなたの例は以下のとおりです。あなたが実際にしたいことは、むしろilocを使用するよりも、行番号である場合

  1. はA> 3(行2を返します)最初の行

    >>> df[df.A > 3].iloc[0] 
    A 4 
    B 6 
    C 3 
    Name: 2, dtype: int64 
    

を取得し、それがdf[df.A > 3].index[0]となります。

  • A> 4 AND B> 3最初の行取得

      >>> df[(df.A > 4) & (df.B > 3)].iloc[0] 
      A 5 
      B 4 
      C 5 
      Name: 4, dtype: int64 
      
    1. はA> 3 AND(B> 3またはC> 2の最初の行を取得します)(今、あなたの最後のケースで、我々は降順ソートフレームを返すデフォルトのケースを処理する関数を書くことができます行2)

      >>> df[(df.A > 3) & ((df.B > 3) | (df.C > 2))].iloc[0] 
      A 4 
      B 6 
      C 3 
      Name: 2, dtype: int64 
      

    を返します。

    >>> def series_or_default(X, condition, default_col, ascending=False): 
    ...  sliced = X[condition] 
    ...  if sliced.shape[0] == 0: 
    ...   return X.sort_values(default_col, ascending=ascending).iloc[0] 
    ...  return sliced.iloc[0] 
    >>> 
    >>> series_or_default(df, df.A > 6, 'A') 
    A 5 
    B 4 
    C 5 
    Name: 4, dtype: int64 
    

    予想したように、それは返す行4

  • 7

    queryを使用します。

    df.query(' A > 3').head(1) 
    Out[33]: 
        A B C 
    2 4 6 3 
    
    df.query(' A > 4 and B > 3').head(1) 
    Out[34]: 
        A B C 
    4 5 4 5 
    
    df.query(' A > 3 and (B > 3 or C > 2)').head(1) 
    Out[35]: 
        A B C 
    2 4 6 3 
    
    +0

    クエリは、私のスライスアプローチよりもはるかにきれいに見えます。 – PabTorre

    1

    あなたがスライシングとヘッドとの最初の3つの項目の世話をすることができます:

    1. df[df.A>=4].head(1)
    2. df[(df.A>=4)&(df.B>=3)].head(1)
    3. df[(df.A>=4)&((df.B>=3) * (df.C>=2))].head(1)
    ケース何で0

    条件は

    try: 
        output = df[df.A>=6].head(1) 
        assert len(output) == 1 
    except: 
        output = df.sort_values('A',ascending=False).head(1)