2017-10-15 12 views
2

列の1つのサブ文字列に基づいてPythonデータフレームをフィルタリングしようとしています。Python、Pandas:関数に基づいてデータフレームの行をフィルタリングします。

IDフィールドの位置13 & 14の番号が< = 9の場合、行を保持したい場合は、行が9より大きい場合は行を削除したいと考えています。

例:

ABCD-3Z-A93Z-01A-11R-A37O-07 - >保つ

ABCD-3Z-A93Z-11A-11R-A37O-07 - >ドロップ

私は下のソリューションに到達することができましたが、より迅速かつ効率的な方法が必要であると思います。その後、

位置によって値に対する
import pandas as pd 

# Enter some data. We want to filter out all rows where the number at pos 13,14 > 9 
df = {'ID': ['ABCD-3Z-A93Z-01A-11R-A37O-07', 'ABCD-6D-AA2E-11A-11R-A37O-07', 'ABCD-6D-AA2E-01A-11R-A37O-07', 
      'ABCD-A3-3307-01A-01R-0864-07', 'ABCD-6D-AA2E-01A-11R-A37O-07', 'ABCD-6D-AA2E-10A-11R-A37O-07', 
      'ABCD-6D-AA2E-09A-11R-A37O-07'], 
     'year': [2012, 2012, 2013, 2014, 2014, 2017, 2015] 
} 
# convert to df 
df = pd.DataFrame(df) 

# define a function that checks if position 13&15 are > 9. 
def filter(x): 
    # that, if x is a string, 
    if type(x) is str: 
     if int(float(x[13:15])) <= 9: 
      return True 
     else: 
      return False 
    else: 
     return False 

# apply function 
df['KeepRow'] = df['ID'].apply(filter) 
print(df) 

# Now filter out rows where "KeepRow" = False 
df = df.loc[df['KeepRow'] == True] 
print(df) 
# drop the column "KeepRow" as we don't need it anymore 
df = df.drop('KeepRow', axis=1) 
print(df) 

答えて

2

使用indexing with strboolean indexingによってfloatおよびフィルタに変換します。

df = df[df['ID'].str[13:15].astype(float) <=9] 
print(df) 
          ID year 
0 ABCD-3Z-A93Z-01A-11R-A37O-07 2012 
2 ABCD-6D-AA2E-01A-11R-A37O-07 2013 
3 ABCD-A3-3307-01A-01R-0864-07 2014 
4 ABCD-6D-AA2E-01A-11R-A37O-07 2014 
6 ABCD-6D-AA2E-09A-11R-A37O-07 2015 

は詳細:

print(df['ID'].str[13:15]) 
0 01 
1 11 
2 01 
3 01 
4 01 
5 10 
6 09 
Name: ID, dtype: object 
+1

ブリリアント、ありがとう!とても簡単!私は5分で答えを受け入れることができます私に言っているStackoverflowです。そうするでしょう。 – Laura

2

私はあなただけの13番目のシンボルに基づいてフィルタ処理することができると思いますあなたの文字列:

インポートパンPDとしてダス

# Enter some data. We want to filter out all rows where the number at pos 13,14 > 9 
df = pd.DataFrame({ 
    'ID': ['ABCD-3Z-A93Z-01A-11R-A37O-07', 
      'ABCD-6D-AA2E-11A-11R-A37O-07', 
      'ABCD-6D-AA2E-01A-11R-A37O-07', 
      'ABCD-A3-3307-01A-01R-0864-07', 
      'ABCD-6D-AA2E-01A-11R-A37O-07', 
      'ABCD-6D-AA2E-10A-11R-A37O-07', 
      'ABCD-6D-AA2E-09A-11R-A37O-07'], 
    'year': [2012, 2012, 2013, 2014, 2014, 2017, 2015] 
}) 
# convert to df 

df['KeepRow'] = df['ID'].apply(lambda x: x[13] == '0') 

または単に:

df[df['ID'].apply(lambda x: x[13] == '0')] 
+0

ありがとうございます!これは素晴らしい作品です! – Laura

関連する問題