在Python中动态拆分数据框架

时间:2016-06-28 13:48:22

标签: 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')

2 个答案:

答案 0 :(得分: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)

这为您留下了两个数据帧:

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

>df_subset
   cat dog
0   A   e

实际上没有必要使用某个功能,但我把它留在那里,这样你就可以看到这个功能是如何工作的。特别要注意的是,当你希望它返回时,你不会将outval传递给它。

其他一些附注:

可以从字典中创建数据框,其值为列表,因此无需调用Series

不要将您的数据框对象命名为与您引用的数据框列相同的内容(在本例中为#34; cat"),因为它只是令人困惑。如果您只处理一个数据帧,则惯例是使用df

除了制作分割器功能之外,对于这个简单的事情你可以这样做:df_subset = df[df['cat'] == val],除非这只是一个玩具示例,当然还需要在函数内部发生更多。

答案 1 :(得分:0)

您可以更轻松地访问数据框:

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

请注意,pandas会为您提供视图或副本,具体取决于上下文。这在[{3}}

中有解释

这意味着当您返回视图时,它们将由基础数据集备份。获得副本后,对该副本的修改不会反映在原始数据集中。

这意味着您在事后操纵结果时需要小心。如果它是副本,如果发生写入操作,您将收到很多警告。

您似乎为所有内容创建了数据框架,因此可能只对副本感兴趣。在这种情况下,你关心的主要是它是否适合记忆。