2015-12-08 56 views
1

我是python的新手,我試圖通過讀取excel文件將參數(數據框)傳遞給函數並更改參數(數據框)的值。 (假設我已經導入了所有必需的文件)將python數據框傳遞給對象並更改數據框

我注意到python沒有在這裏通過引用傳遞參數,我最終沒有對數據幀進行初始化/更改。

我讀到python通過對象引用而不是通過值或引用。但是,我不需要更改相同的數據框。

的輸出是:類 'pandas.core.frame.DataFrame'>

from pandas import DataFrame as df 
class Data: 
    x = df 

    @staticmethod 
    def import_File(df_name , file): 
     df_name = pd.io.excel.read_excel(file.replace('"',''), sheetname='Sheet1', header=0, skiprows=None, skip_footer=0, index_col=None, parse_cols=None, parse_dates=True, date_parser=True, na_values=None, thousands=None, convert_float=True, has_index_names=None, converters=None, engine=None) 


def inputdata(): 
    Data.import_File(Data.x,r"C:\Users\Data\try.xlsx") 
    print(Data.x) 
+0

請讓我們知道,我們可以進一步幫助您解決這個問題。否則,如果您發現其中一個答覆回答您的問題,請接受它。謝謝! – imp9

回答

2

在代碼df是類對象。要創建一個空的數據框,你需要實例化它。 Python中的Instantiating類使用函數表示法。另外,當我們讀取excel文件時,我們不需要傳遞默認參數。這將有助於代碼看起來更乾淨。
另外,當我們讀取excel文件時,我們不需要傳遞默認參數。這將有助於代碼看起來更乾淨。

from pandas import DataFrame as df 
class Data: 
    x = df() 

    @staticmethod 
    def import_File(df_name, file): 
     df_name = pd.io.excel.read_excel(file.replace('"',''), sheetname='Sheet1') 

當傳遞到Data.ximport_File()df_name將是指相同的對象作爲Data.x,在這種情況下是一個空數據幀。但是,如果將pd.io.excel.read_excel(file)指定爲df_name,則df_name與空數據框之間的連接將中斷,並且df_name現在指的是excel數據幀。 Data.x在此過程中沒有發生任何變化,所以它仍然連接到空數據框對象。

更簡單的方法來看到這個用繩子:

x = 'red' 
df_name = x 

我們可以打破「紅色」字符串對象之間的df_name連接,形成一個新的使用對象excel`。

df_name = 'excel' 
print(x) 
'red' 

但是,Data.x有一個簡單的修復方法來返回excel數據幀。

from pandas import DataFrame as df 
class Data: 
    x = df() 

    @staticmethod 
    def import_File(file): 
     Data.x = pd.io.excel.read_excel(file.replace('"',''), sheetname='Sheet1') 

def inputdata(): 
    Data.import_File(r"C:\Users\Data\try.xlsx") 
    print(Data.x) 

但是,我不建議使用staticmethods,並且應該在類中包含一個構造函數作爲其他答案推薦的方法。

4

你似乎在艱難地做着很多事情。我會盡量在符合標準使用模式的同時簡化它。

# Whatever imports you need 
import pandas as pd 


# Static variables and methods should generally be avoided. 
# Change class and variable names to whatever is more suitable. 
# Names should be meaningful when possible. 
class MyData: 

    # Load data in constructor. Could easily do this in another method. 
    def __init__(self, filename): 
     self.data = pd.io.excel.read_excel(filename, sheetname='Sheet1') 


def inputData(): 
    # In my experience, forward slashes work just fine on Windows. 
    # Create new MyData object using constructor 
    x = MyData('C:/Users/Data/try.xlsx') 

    # Access member variable from object 
    print(x.data) 

這裏是加載方法而不是構造函數的版本。

import pandas as pd 


class MyData: 

    # Constructor 
    def __init__(self): 
     # Whatever setup you need 
     self.data = None 
     self.loaded = False 

    # Method with optional argument 
    def loadFile(self, filename, sheetname='Sheet1') 
     self.data = pd.io.excel.read_excel(filename, sheetname=sheetname) 
     self.loaded = True 


def inputData(): 
    x = MyData() 
    x.loadFile('C:/Users/Data/try.xlsx') 
    print(x.data) 

    # load some other data, using sheetname 'Sheet2' instead of default 
    y = MyData() 
    y.loadFile('C:/Users/Data/tryagain.xlsx', 'Sheet2') 
    # can also pass arguments by name in any order like this: 
    # y.loadFile(sheetname='Sheet2', filename='C:/Users/Data/tryagain.xlsx') 
    print(y.data) 

    # x and y both still exist with different data. 
    # calling x.loadFile() again with a different path will overwrite its data. 

之所以它不會在你原來的代碼保存是因爲分配值參數名稱不會改變在Python的原始變量。你可以做的是這樣的:

# Continuing from the last code block 

def loadDefault(data): 
    data.loadFile('C:/Users/Data/try.xlsx') 

def testReference(): 
    x = MyData() 
    loadDefault(x) 
    # x.data now has been loaded 
    print(x.data) 


# Another example 

def setIndex0(variable, value): 
    variable[0] = value 

def testSetIndex0(): 
    v = ['hello', 'world'] 
    setIndex0(v, 'Good morning') 
    # v[0] now equals 'Good morning' 
    print(v[0]) 

但你不能做到這一點:如果你希望能夠到指定位置使用一個名稱來存儲值

def setString(variable, value): 
    # The only thing this changes is the value of variable inside this function. 
    variable = value 

def testSetString(): 
    v = 'Start' 
    setString(v, 'Finish') 
    # v is still 'Start' 
    print(v) 

,你可以使用帶索引/鍵的數據結構。字典允許您使用密鑰訪問和存儲值。

import pandas as pd 


class MyData: 

    # Constructor 
    def __init__(self): 
     # make data a dictionary 
     self.data = {} 

    # Method with optional argument 
    def loadFile(self, storename, filename, sheetname='Sheet1') 
     self.data[storename] = pd.io.excel.read_excel(filename, sheetname=sheetname) 

    # Access method 
    def getData(self, name): 
     return self.data[name] 


def inputData(): 
    x = MyData() 
    x.loadFile('name1', 'C:/Users/Data/try.xlsx') 
    x.loadFile('name2', 'C:/Users/Data/tryagain.xlsx', 'Sheet2') 

    # access Sheet1 
    print(x.getData('name1')) 

    # access Sheet2 
    print(x.getData('name2')) 

如果你真的希望函數是靜態的,那麼你根本不需要創建一個新類。創建類的主要原因是將其用作可重複使用的結構,以便使用特定於該數據的方法保存數據。

import pandas as pd 

# wrap read_excel to make it easier to use 
def loadFile(filename, sheetname='Sheet1'): 
    return pd.io.excel.read_excel(filename, sheetname=sheetname) 

def inputData(): 
    x = loadFile('C:/Users/Data/try.xlsx') 
    print(x) 

    # the above is exactly the same as 
    x = pd.io.excel.read_excel('C:/Users/Data/try.xlsx', sheetname='Sheet1') 
    print(x) 
+0

感謝您的回答。但是,我一直在考慮在一個類中存在多個數據幀屬性的情況。說,X,Y,Z和我想有一個簡單的方法來實例化每個與一個方法獲取他們的名字和導入文件。想象一下,我們有多個數據框可以加載到一個類對象中。我使用靜態,因爲加載一個Excel文件似乎不是特定於類對象。 –

+1

我添加了更多的示例,希望他們解決在一個對象中如何使用可變數量的數據框以及如何使用函數而不是類。 – Darcinon

+0

謝謝,非常有幫助。 –