2017-08-29 8 views
1

私のコードは以前のデータセットで動作し、現在は動作を停止しています。私はこのエラーメッセージのために他の答えを見てみましたが、私には当てはまりません。Python Pandas Indexエラー:リストインデックスが範囲外です。

Email_Addressのデータフレームdfに1つの列があり、ドメインを新しい列に分割したいと考えています。

私のデータフレームは以前のdfのサブセットです。

#create new df, for only email addresses I need to review 
df = df_raw.loc[df_raw['Review'] == 'Y'].copy() 

#I reset the index to fix the problem, but it didnt help 
df = df.reset_index(drop=True) 

#ensure Email Address is a string 
df['Email_Address']= df.Email_Address.apply(str) 

#make Email Address lower case 
df['email_lowercase'] = df['Email_Address'].str.lower() 

#Split out domain into a new column 
df['domain'] = df['email_lowercase'].apply(lambda x: x.split('@')[1]) 

IndexError: list index out of range 
+2

これは、シンボルは '@' doesnのことを意味するかもしれません'@ 'の後にある電子メールの部分にはアクセスできないように、あなたのセルの1つに存在していません。ユーザは '@ 'ではなく' at'と入力することがあるので、ボットでは追跡できません。あなたはそれをチェックしましたか? – ysearka

+1

わかりませんが、この 'df ['Email_Address'] = df.Email_Address.apply(str)'をこの 'df ['Email_Address'] = df.Email_Address.astype(str)'に変更してみてください。 '@'の後のいくつかの行にデータが存在しないため、データが破損する可能性があります。それもチェックしてください。 –

+1

代表的な 'df'がなくても、エラーを再現することは不可能です。 [MVCE](https://stackoverflow.com/help/mcve) – C8H10N4O2

答えて

3

あなたのデータフレームに無効なメールがある可能性があります。 あなたは、ドメインにでも

def extract_domain(email): 
    email_domain = email.split('@') 
    if len(email_domain) > 1: 
     return email_domain[1] 

df['domain'] = df['email_lowercase'].apply(extract_domain) 

かを抽出するために、このアプローチを使用することができ

df[~df.Email_Address.astype(str).str.contains('@')] 

を使用して、これらを識別することができます短い:

df['domain'] = df['email_lowercase'].str.split('@').apply(lambda li: li[1] if len(li) > 1 else None) 
+0

を提供してくれてありがとう、私はこれを試して、AttributeErrorを得る: 'シリーズ'オブジェクトには 'contains'属性がありません – jeangelj

+0

@jeangeljこれを修正しました。 (前に '含む'の前に 'str.'を入れておいてください) –

+0

ありがとう、驚いたことにいくつかのナンがいるようです - 私は0にしました – jeangelj

関連する問題