2017-08-09 10 views
0

でない数値である場合、私はデータフレームを有する:スキップ操作がパンダのデータフレーム

import pandas as pd 
df = pd.DataFrame({'start' : [5, 10, '$%%', 20], 'stop' : [10, 20, 30, 40]}) 
df['length_of_region'] = pd.Series([0 for i in range(0, len(df['start']))]) 

を私が唯一の非ゼロ数字列値の領域の長さを計算し、と行の機能をスキップします値が正しくない場合はエラー・ノート。ここで私はこれまで持っているものです。

df['Notes'] = pd.Series(["" for i in range(0, len(df['region_name']))]) 

for i in range(0, len(df['start'])): 
    if pd.isnull(df['start'][i]) == True: 
     df['Notes'][i] += 'Error: Missing value for chromosome start at region %s, required value;' % (df['region_name'][i]) 
     df['critical_error'][i] = True 
     num_error = num_error+1 
    else: 
     try: 
      #print (df['start'][i]).isnumeric() 
      start = int(df['start'][i]) 
      #print start 
      #print df['start'][i] 
      if start == 0: 
       raise ValueError 
     except: 
      df['Notes'][i] += 'Error: Chromosome start should be a non zero number at region %s; ' % (df['region_name'][i]) 
      #print df['start'][i] 
      df['critical_error'][i] = True 
      num_error = num_error+1 
for i in range(0, len(df['start'][i])): 
    if df['critical_error'][i] == True: 
     continue 
    df['length_of_region'][i] = (df['stop'][i] - df['start'][i]) + 1.0 

はしかし、pandasstr変数にdf['start']を変換し、私はそれを変換するためにintを使用している場合でも、私は次のエラーを取得する:

df['length_of_region'][i] = (df['stop'][i] - df['start'][i]) + 1.0 

TypeError: unsupported operand type(s) for -: 'numpy.int64' and 'str'

私はここで何が欠けていますか?御時間ありがとうございます!

答えて

0

を、シンプルを発見し、次のように私がtry-exceptで使用startdf['start'][i]を再割り当てするためのエレガントな修正:

for i in range(0, len(df['start'])): 
    if pd.isnull(df['start'][i]) == True: 
     df['Notes'][i] += 'Error: Missing value for chromosome start at region %s, required value;' % (df['region_name'][i]) 
     df['critical_error'][i] = True 
     num_error = num_error+1 
    else: 
     try: 
      start = int(df['start'][i]) 
      df['start'][i] = start 
      if start == 0: 
       raise ValueError 
     except: 
      df['Notes'][i] += 'Error: Chromosome start should be a non zero number at region %s; ' % (df['region_name'][i]) 
      #print df['start'][i] 
      df['critical_error'][i] = True 
      num_error = num_error+1 
for i in range(0, len(df['start'][i])): 
    if df['critical_error'][i] == True: 
     continue 
    df['length_of_region'][i] = (df['stop'][i] - df['start'][i]) + 1.0 

スタート変数を再割り当ては、int形式に変換します数字の列の場合にのみlength_of_regionを計算するのに役立ちます

0

カスタム関数を定義して計算を行い、その関数を各行に適用することができます。

def calculate_region_length(x): 
    start_val = x[0] 
    stop_val = x[1] 
    try: 
     start_val = float(start_val) 
     return (stop_val - start_val) + 1.0 
    except ValueError: 
     return None 

カスタム関数は、リストを入力として受け入れます。この関数は開始値をテストして浮動小数点数に変換できるかどうかを調べます。それができない場合はNoneが返されます。このように '1'が文字列として格納されている場合、値はfloatに変換され、スキップされることはありませんが、あなたの例では '$ %%'は返されず、Noneを返します。

次はあなたが、各行のカスタム関数を呼び出す:

df['length_of_region'] = df[['start', 'stop']].apply(lambda x: calculate_region_legnth(x), axis=1) 

これはstartstartをすることはできません文字列で、非転換の文字列とNoneない行について(stop - start) + 1.0を使用して新しい列を作成します。番号に変換されます。

あなたはその後、Noneが開始値が欠落している部分を識別するために返された行に基づいてNotesフィールドを更新することができます。かなりの時間のためのコードを見つめた後

df.loc[df['length_of_region'].isnull(), 'Notes'] = df['region_name'] 
+0

こんにちは、ありがとうございました!私は、コードのアーキテクチャを大幅に変更せず、同様の形式でかなりの他の変数を計算しているのと同じフォーマットを続ける方法を探していました。 –

関連する問題