2016-08-03 76 views
2

我有一个创建数据帧的函数。这是第一个功能。在第二个函数中,我想使用我在第一个函数中创建的数据框。如何从函数返回数据帧

这是缩短功能:

def einlesen(): 
    rbu = pd.read_excel('INPUT\RBU_COIN2.xlsx') #RBU-DATEN AUS EXCEL EINLESEN 
    data_faktura = pd.merge(rbu, hvl, on='EQ_NR', how='left') #RBU UND HVL ANHAND DER EQ_NR ZUGEORDNET 
    print('RBU-DATEN UND HVL-DATEN ZUSAMMENGEFASST!') 
    data_faktura['TA'] = data_faktura['TA'].replace(['CORENET', 'MOBCORENET', 'mobRAN', 'mobCORENET', 'MOBRAN', 'RZ-Server', 'Sonstiges'], 'SONSTIGES') #TA NACH SUCHKRITERIEN ERSETZT 
    data_faktura['TA'] = data_faktura['TA'].replace(['RIFU', 'Rifu', 'rifu'], 'RIFU') 
    data_faktura['TA'] = data_faktura['TA'].replace(['TRANSPORTNETZ/WDM', 'Transportnetz/WDM', 'TRANSPORTNETZ/wdm', 'Transportnetz/wdm'], 'TRANSPORTNETZ/WDM') 
    data_faktura['TA'] = data_faktura['TA'].replace(['TVGrundv', 'tvgrundv', 'TVGrundV', 'TVgrundv'], 'TVGRUNDV') 
    data_faktura['TA'] = data_faktura['TA'].replace(['IP-CORE-VOICE'], 'IP-CORE') 
    data_faktura['TA'] = data_faktura['TA'].replace(['AGS0'], 'AGS') 
    data_faktura['TA'].fillna('SONSTIGES', inplace=True) #LEERWERTE ERSETZT 
    print('TECHNIKARTEN ZUGEWIESEN!') 
    #data_faktura.to_excel('fakt_daten.xlsx', index=False) #OUTPUT ALS EXCELDATEI 
    print('Daten für Berechnung des Zwischenergebnisses erfasst!') 
    Button_start1.config(state=ACTIVE) #BUTTON WIEDER AUF AKTIV GESETZT 
    msg_oben.config(text='Daten eingelesen! Bitte Berechnung starten!') 
    #os.startfile('fakt_daten.xlsx') 
    return data_faktura 

,你可以看到我试图从功能而归数据帧“返回data_faktura”,但它没有工作。

我尝试调用数据框 “data_faktura” 这样的:

def zwischenergebnis(data_faktura): 
    data_kl2m = data_faktura # EINLESEN VON TA '<2M' UND BILDUNG DER SUMME 
    data_kl2m = data_kl2m[data_kl2m.TA == '<2M'] 

以下是错误我得到:

TypeError: zwischenergebnis() missing 1 required positional argument: 'data_faktura' 

那我怎么调用的函数:

Button_einlesen = ttk.Button(mainWin, text='Faktura einlesen!', command=einlesen) 
Button_einlesen.grid(row=4, columnspan=6, sticky="ew") 
Button_start1= ttk.Button(mainWin, text='Zwischenergebnisse berechnen!', state=DISABLED, command=zwischenergebnis) 
Button_start1.grid(row=5, column=0, columnspan=3, sticky="ew") 

我该如何解决这个问题?或者我在这里做错了什么?

谢谢你的帮助!


@tzaman:

以下是错误我得到:

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Users\A52113242\AppData\Local\Downloaded Apps\Winpython\python-3.4.3\lib\site-packages\pandas\core\nanops.py", line 93, in f 
    result = alt(values, axis=axis, skipna=skipna, **kwds) 
    File "C:\Users\A52113242\AppData\Local\Downloaded Apps\Winpython\python-3.4.3\lib\site-packages\pandas\core\nanops.py", line 250, in nansum 
    the_sum = values.sum(axis, dtype=dtype_sum) 
    File "C:\Users\A52113242\AppData\Local\Downloaded Apps\Winpython\python-3.4.3\lib\site-packages\numpy\core\_methods.py", line 32, in _sum 
    return umr_sum(a, axis, dtype, out, keepdims) 
TypeError: unsupported operand type(s) for +: 'float' and 'str' 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "C:\Users\A52113242\AppData\Local\Downloaded Apps\Winpython\python-3.4.3\lib\tkinter\__init__.py", line 1533, in __call__ 
    return self.func(*args) 
    File "C:\Users\A52113242\Desktop\PROJEKTE\[INPROGRESS] Faktura_sylvia\Faktool\geruest_tool.py", line 221, in zwischenergebnis 
    data_ags1_mw_KW = data_ags1_mw['KW_WERT'].sum() 
    File "C:\Users\A52113242\AppData\Local\Downloaded Apps\Winpython\python-3.4.3\lib\site-packages\pandas\core\generic.py", line 4255, in stat_func 
    skipna=skipna, numeric_only=numeric_only) 
    File "C:\Users\A52113242\AppData\Local\Downloaded Apps\Winpython\python-3.4.3\lib\site-packages\pandas\core\series.py", line 2084, in _reduce 
    return op(delegate, skipna=skipna, **kwds) 
    File "C:\Users\A52113242\AppData\Local\Downloaded Apps\Winpython\python-3.4.3\lib\site-packages\pandas\core\nanops.py", line 45, in _f 
    return f(*args, **kwargs) 
    File "C:\Users\A52113242\AppData\Local\Downloaded Apps\Winpython\python-3.4.3\lib\site-packages\pandas\core\nanops.py", line 95, in f 
    result = alt(values, axis=axis, skipna=skipna, **kwds) 
    File "C:\Users\A52113242\AppData\Local\Downloaded Apps\Winpython\python-3.4.3\lib\site-packages\pandas\core\nanops.py", line 250, in nansum 
    the_sum = values.sum(axis, dtype=dtype_sum) 
    File "C:\Users\A52113242\AppData\Local\Downloaded Apps\Winpython\python-3.4.3\lib\site-packages\numpy\core\_methods.py", line 32, in _sum 
    return umr_sum(a, axis, dtype, out, keepdims) 
TypeError: unsupported operand type(s) for +: 'float' and 'str' 
+0

我没有看到'data_faktura'在你的函数创建的任何地方。 – piRSquared

+1

也许在函数'def einlesen()'需要'返回rbu'而不是'return data_faktura'。 – jezrael

+0

请发布所有相关的代码,包括你如何调用'einlesen'和'zwischenergebnis'。 – tzaman

回答

2

您的按钮回调不能直接通过返回和参数传递沟通,因为你没有实际美其名曰你自己。

相反,你可以做一些事情,比如将它们添加到类中并使用实例变量。事情是这样的:

class Commands(): 
    def einlesen(self): 
     # ... all your code 
     self.df = data_faktura 

    def zwischenergebnis(self): 
     data_faktura = self.df 
     # proceed as before 

然后你就可以实例化一个对象Commands并结合其方法为您的按钮回调:

commander = Commands() 
Button_einlesen = ttk.Button(mainWin, text='..', command=commander.einlesen) 
Button_start1= ttk.Button(mainWin, text='..', command=commander.zwischenergebnis) 
+0

我试过它像你发布它!现在我得到另一个错误!我在我的帖子中编辑错误! – Damian

+0

你的错误出现在'data_ags1_mw ['KW_WERT']。sum()'行 - 显然你试图'求和'的所有信息都不是数字,所以它失败了。如果您仍然遇到问题,请发布一个单独的问题,提供有关您的数据框的更多详细信息。 – tzaman

+0

是的,我看到了..我检查了!但是你的解决方案适用于所提到的问题!谢谢 ;) – Damian