pandasを使った抽出

judge = df['country']=='England' Englandのみで抽出
print(judge) T or Fで返ってくる
df[judge]   TのみのデータをDfで返ってくる
0        False
1         True
2        False
3         True
4        False
         ...  
39003    False
39004    False
39005    False
39006    False
39007    False
Name: country, Length: 39008, dtype: bool
datehome_teamaway_teamhome_scoreaway_scoretournamentcitycountryneutral
11873-03-08EnglandScotland42FriendlyLondonEnglandFalse
31875-03-06EnglandScotland22FriendlyLondonEnglandFalse
61877-03-03EnglandScotland13FriendlyLondonEnglandFalse
101879-01-18EnglandWales21FriendlyLondonEnglandFalse
111879-04-05EnglandScotland54FriendlyLondonEnglandFalse
388732018-03-27AustraliaColombia00FriendlyLondonEnglandTrue
388812018-03-27EnglandItaly11FriendlyLondonEnglandFalse
389072018-03-27SerbiaNigeria20FriendlyLondonEnglandTrue
389812018-06-02EnglandNigeria21FriendlyLondonEnglandFalse
389972018-06-03CroatiaBrazil02FriendlyLiverpoolEnglandTrue

568 rows × 9 columns

  • print(judge)とdf[judge]の2種類の出力がされている
  • 上記のプログラムではEnglandで行われた試合のみを抜き出している
  • df['country']=='England'では各行についてTrueFalseを生成している
    • ==は論理式の一つで、記号の左右が等しいかを判断している
    • 出力される行数はdfの行数に等しくなる
  • df[judge]では,df[]の中身(judge)がTrueの行のみ出力されている

他の基本的な論理式の紹介

  • a>b aはbより大きい
  • a<b aはbより小さい
  • a<=b aはb以下
  • a>=b aはb以上
  • a!=b aとbは同じでない

他にも以下のような抜き出し方がある

  • df['列名'].str.contains('探したい文字列')
    • 探したい文字列が指定された範囲内に含まれているか判断しTrueFalseを返す
df1=pd.read_csv("International_football_results.csv")
df1.info()
match_2010 = df1["date"].str.contains("2010") 列を指定して、その後、検索文字
df1[match_2010] match_2010はTorFのデータなので
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 39008 entries, 0 to 39007
Data columns (total 9 columns):
 #   Column      Non-Null Count  Dtype 
---  ------      --------------  ----- 
 0   date        39008 non-null  object
 1   home_team   39008 non-null  object
 2   away_team   39008 non-null  object
 3   home_score  39008 non-null  int64 
 4   away_score  39008 non-null  int64 
 5   tournament  39008 non-null  object
 6   city        39008 non-null  object
 7   country     39008 non-null  object
 8   neutral     39008 non-null  bool  
dtypes: bool(1), int64(2), object(6)
memory usage: 2.4+ MB

Out[7]:

datehome_teamaway_teamhome_scoreaway_scoretournamentcitycountryneutral
314082010-01-02IranKorea DPR10FriendlyDohaQatarTrue
314092010-01-02QatarMali00FriendlyDohaQatarFalse
314102010-01-02SyriaZimbabwe60FriendlyKuala LumpurMalaysiaTrue
314112010-01-02YemenTajikistan01FriendlySana’aYemenFalse
314122010-01-03AngolaGambia11FriendlyVila Real de Santo AntónioPortugalTrue
322412010-12-28Saudi ArabiaIraq01FriendlyDammamSaudi ArabiaFalse
322422010-12-29IndonesiaMalaysia21AFF ChampionshipJakartaIndonesiaFalse
322432010-12-30SyriaKorea Republic01FriendlyAbu DhabiUnited Arab EmiratesTrue
322442010-12-31KuwaitZambia40Friendly6th of October CityEgyptTrue
322452010-12-31QatarKorea DPR01FriendlyDohaQatarFalse

838 rows × 9 columns

複数の条件に一致するデータを取り出す

複数の条件を設定する時、必須な知識が存在する。

  1. 和集合 記号|(Shiftキー + ¥) 日本語で言う「または
  2. 積集合 記号&(Shiftキー + 6) 日本語で言う「かつ

これらを利用する必要がある。

judge2 = (df['home_score']>=3) | (df['away_score']>=3)

df[]+条件 とすると、中身は T or F の式になる
|では条件をそれぞれカッコでくくる
print(judge2)
df[judge2]
0        False
1         True
2        False
3        False
4         True
         ...  
39003    False
39004    False
39005    False
39006    False
39007     True
Length: 39008, dtype: bool
datehome_teamaway_teamhome_scoreaway_scoretournamentcitycountryneutral
11873-03-08EnglandScotland42FriendlyLondonEnglandFalse
41876-03-04ScotlandEngland30FriendlyGlasgowScotlandFalse
51876-03-25ScotlandWales40FriendlyGlasgowScotlandFalse
61877-03-03EnglandScotland13FriendlyLondonEnglandFalse
81878-03-02ScotlandEngland72FriendlyGlasgowScotlandFalse
389892018-06-02IcelandNorway23FriendlyReykjavíkIcelandFalse
389942018-06-03AlbaniaUkraine14FriendlyÉvian-les-BainsFranceTrue
389952018-06-03Saudi ArabiaPeru03FriendlySt. GallenSwitzerlandTrue
389982018-06-03Costa RicaNorthern Ireland30FriendlySan JoséCosta RicaFalse
390072018-06-04IndiaKenya30FriendlyMumbaiIndiaFalse
  • print(judge)とdf[judge]の2種類の出力がされている
  • home_teamaway_teamどちらかに3以上の数字が入っている行を抜き出している
  • 前半の条件文と後半の条件文を 「|」 で区切ることで「または」という意味になる
  • データ名[(条件文1) | (条件文2)]で「条件文1または条件文2を満たすものを指定する」という意味になる
df2 = pd.read_csv("sample-data.csv")
df2.info()
young = (df2["Age"] <= 40) & (df2["Gender"] == "M")
df2[young] youngは Tor Fなので
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 30 entries, 0 to 29
Data columns (total 7 columns):
 #   Column          Non-Null Count  Dtype  
---  ------          --------------  -----  
 0   Age             25 non-null     float64
 1   Blood_pressure  27 non-null     float64
 2   Vital_capacity  27 non-null     float64
 3   Gender          30 non-null     object 
 4   Disease         30 non-null     int64  
 5   Weight          25 non-null     float64
 6   Height          23 non-null     float64
dtypes: float64(5), int64(1), object(1)
memory usage: 1.8+ KB
AgeBlood_pressureVital_capacityGenderDiseaseWeightHeight
022.0110.04300.0M179.0183.0
427.0108.04800.0M080.0192.0
1132.0124.03900.0M061.0177.0
1536.0128.03420.0M155.0154.0
1637.0116.03800.0M170.0171.0
1737.0NaN4150.0M1NaNNaN
1939.0116.04550.0M186.0187.0

コメント

タイトルとURLをコピーしました