2017-08-23 12 views
1

私はcsvからデータフレームを作成する関数と、そのデータフレームを操作する関数の2つの関数を持っています。 lsc_age(import_data())関数を使って生データを初めて渡すときに問題はありません。しかし、2回目の試行で上記の参照エラー(TypeError: 'DataFrame' object is not callable)が発生します。どのように問題を解決するための任意のアイデア?TypeError: 'DataFrame'オブジェクトは呼び出し可能なPython関数ではありません

あなたがデータフレームを使用して関数オブジェクトを上書きしているラインであなたの関数への最初の呼び出し lsc_age()

lsc_age = data_two.groupby(['year','age_group','lsc'])['event'].count().reset_index().sort_values(by=['age_group','event'],ascending=False) 

中に

def import_data(csv,date1,date2): 
    global data 
    data = pd.read_csv(csv,header=1) 
    data = data.iloc[:,[0,1,4,6,7,8,9,11]] 
    data = data.dropna(how='all') 
    data = data.rename(columns={"National: For Dates 9//1//"+date1+" - 8//31//"+date2:'event','Unnamed: 1':'time','Unnamed: 4':'points',\ 
       'Unnamed: 6':'name','Unnamed: 7':'age','Unnamed: 8':'lsc','Unnamed: 9':'club','Unnamed: 11':'date'}) 
    data = data.reset_index().drop('index',axis=1) 
    data = data[data.time!='Time'] 
    data = data[data.points!='Power '] 
    data = data[data['event']!="National: For Dates 9//1//"+date1+" - 8//31//"+date2] 
    data = data[data['event']!='USA Swimming, Inc.'] 
    data = data.reset_index().drop('index',axis=1) 
    for i in range(len(data)): 
     if len(str(data['event'][i])) <= 3: 
      data['event'][i] = data['event'][i-1] 
     else: 
      data['event'][i] = data['event'][i] 
    data = data.dropna() 
    age = [] 
    event = [] 
    gender = [] 
    for row in data.event: 
     gender.append(row.split(' ')[0]) 
     if row[:9]=='Female 10': 
      n = 4 
      groups = row.split(' ') 
      age.append(' '.join(groups[1:n])) 
      event.append(' '.join(groups[n:])) 
     elif row[:7]=='Male 10': 
      n = 4 
      groups = row.split(' ') 
      age.append(' '.join(groups[1:n])) 
      event.append(' '.join(groups[n:])) 
     else: 
      n = 2 
      groups = row.split(' ') 
      event.append(' '.join(groups[n:])) 
      groups = row.split(' ') 
      age.append(groups[1]) 
    data['age_group'] = age 
    data['event_simp'] = event 
    data['gender'] = gender 
    data['year'] = date2 
    return data 

def lsc_age(data_two): 
    global lsc, lsc_age, top, all_performers 
    lsc = pd.DataFrame(data_two['event'].groupby(data_two['lsc']).count()).reset_index().sort_values(by='event',ascending=False) 
    lsc_age = data_two.groupby(['year','age_group','lsc'])['event'].count().reset_index().sort_values(by=['age_group','event'],ascending=False) 
    top = pd.concat([lsc_age[lsc_age.age_group=='10 & under'].head(),lsc_age[lsc_age.age_group=='11-12'].head(),\ 
       lsc_age[lsc_age.age_group=='13-14'].head(),lsc_age[lsc_age.age_group=='15-16'].head(),\ 
       lsc_age[lsc_age.age_group=='17-18'].head()],ignore_index=True) 
    all_performers = pd.concat([lsc_age[lsc_age.age_group=='10 & under'],lsc_age[lsc_age.age_group=='11-12'],\ 
          lsc_age[lsc_age.age_group=='13-14'],lsc_age[lsc_age.age_group=='15-16'],\ 
          lsc_age[lsc_age.age_group=='17-18']],ignore_index=True) 
    all_performers = all_performers.rename(columns={'event':'no. top 100'}) 
    all_performers['age_year_lsc'] = all_performers.age_group+' '+all_performers.year.astype(str)+' '+all_performers.lsc 
    return all_performers 

years = [i for i in range(2008,2018)] 
for i in range(len(years)-1): 
    lsc_age(import_data(str(years[i+1])+"national100.csv",\ 
    str(years[i]),str(years[i+1]))) 
+0

エラーが発生している行を知っていますか? – LondonRob

+0

質問を編集して質問のエラーの完全なトレースバックを含める –

+4

副次的なことに、私は*グローバル*の使用を強くお勧めします。引数を関数に渡すか、クラスを使用します。 – Alexander

答えて

6

global lsc, lsc_age, top, all_performers 

Pythonの関数はオブジェクトであり、グローバル名前空間から関数オブジェクトをインポートしたので、これが起こっています。詳しくはhereをご覧ください。

問題を解決するには、グローバルなインポートを避けてください。彼らは必要ではないようです。関数の引数を通してデータを渡してみてください。

関連する問題