2016-06-28 125 views
0

我試圖動態拆分數據幀,但它不工作(這裏有一個簡單的例子):分割數據幀動態在Python

e = {'cat' : pd.Series(['A', 'B', 'C', 'D'])} 
cat = pd.DataFrame(e) 
cat.head(5) 

def splitter(val, outval): 
    outval = pd.DataFrame(cat['cat'] == "val") 

就是我希望做的是爲每個數據集在變量值:我希望該函數將創建一個名爲「A」,其中將包括值「A」數據幀..

splitter('A', 'myset') 

回答

0

你可以更簡單的方式訪問dataframes:

cata = cat[cat['cat'] == 'A'] 
catb = cat[cat['cat'] == 'B'] 

請注意,熊貓給你一個視圖或副本,這取決於上下文。解釋如下:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

這意味着當您返回視圖時,它們由基礎數據集進行備份。當您獲得副本時,對該副本的修改不會反映在原始數據集中。

這是什麼意思是,當你操作結果後,你需要小心。如果它是副本,如果發生寫操作,將會收到許多警告。

您似乎爲所有內容創建數據框,因此可能只對副本感興趣。在那種情況下,你的擔心主要是它是否都適合記憶。

+0

謝謝,但我想動態創建數據框,以便我不必鍵入'cata'或'catb',但值'A'和'B'自動通過CAT'A'或CAT'B '.. – tezzaaa

1

你有什麼問題。主要是,你沒有正確地執行你的功能,而你試圖調用字符串「val」,而不是你的平等變量val。試試這個:

data = {'cat' : ['A', 'B', 'C', 'D'], 'dog' : ['e', 'f', 'g', 'h']} 
df = pd.DataFrame(data) 
print(df) 

def splitter(df, val): 
    return df[df['cat'] == val] 

val = 'A'  
df_subset = splitter(df, val) 

這使你有兩個dataframes:

>df 
    cat dog 
0 A e 
1 B f 
2 C g 
3 D h 

>df_subset 
    cat dog 
0 A e 

這裏其實是沒有必要的功能要做到這一點,但我把它放在那裏,所以你可以看到的功能是如何工作的。特別要注意的是,當你想讓它返回時,你不會傳入outval

其他一些旁註:

Dataframes可以從與值列表字典中創建的,所以沒有必要調用Series

不要將您的數據框對象命名爲您要引用的數據框列(在本例中爲「cat」),因爲它只是令人困惑。如果你只處理一個數據幀,約定是使用df

除了做一個分離器功能,對於這麼簡單的事情你可以這樣做:df_subset = df[df['cat'] == val],除非這只是一個玩具的例子,當然還有更多需要在函數內部發生。

+0

謝謝,幾乎在那裏:你知道我怎麼能在最終的數據框名稱中動態地傳遞'A'的名字嗎?所以df_subset被稱爲df_subset_a呢?這樣不同的子集將被創建爲'貓'的每個值。 – tezzaaa

+0

它可以在循環內完成。例如:'在['A','B','C]中輸入名稱:df [df ['cat'] == name]'會執行三次,一次爲列表中的每個項目。具體細節取決於你想要迭代什麼以及你想要對結果進行什麼操作。 – Jeff