2016-06-28 78 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