我正在尝试动态拆分数据框但它不起作用(这是一个简单的例子):
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 :(得分: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}}
中有解释这意味着当您返回视图时,它们将由基础数据集备份。获得副本后,对该副本的修改不会反映在原始数据集中。
这意味着您在事后操纵结果时需要小心。如果它是副本,如果发生写入操作,您将收到很多警告。
您似乎为所有内容创建了数据框架,因此可能只对副本感兴趣。在这种情况下,你关心的主要是它是否适合记忆。