我有一个需要聚合的计算,但它不适用于PANDA中的GROUPBY。所以,我坚持手动迭代组。这些组由2个“对象”类型值字段定义,这些字段基本上是类别。
我认为一个优雅的解决方案可能是使用分类值从2个独立列中的唯一值创建2个列表。 然后创建一个'for'循环,并使用字符串值或其他东西,迭代我的PANDAs条件语句来创建一个DataFrame;然后最终做我的聚合计算。这种情况一次又一次地发生,只有具有聚合计算的数据帧保存在内存中,并且在'df_'的末尾附加一些计数器值,如'1'。为了不通过循环每次都覆盖。这是我的伪代码。
cats1=['blue','yellow','pink']
cats2=['dog','horse','cow','sheep']
lengths=list(itertools.product(cats1,cats2))
for x,y,z in zip(cats1,cats2,lengths):
df = main_df[ (main_df['col2']==x) & (main_df['col3']==y) ]
df['aggcalc'] = df['col1'].agg.mean()
locals()['df_{0}'.format(z)] = df
最后一行有望根据'cats1'和'cats2'的组合数量创建持久数据帧。即,“df_1”,“df_2”等......然后,每次在“for”循环中,前两行中的“df”才会被覆盖。这是正确的想法吗?
EDIT .............. 这是一个更简单的方法来看待它。 我想从2个独立的,变长列表中循环遍历所有可能的组合。另外,我希望在每个循环中都有一个'计数器','z'。这是编写此输出和后续输出的当前方法:
for x,y in list(itertools.product(cats1,cats2)):
print x,y
blue dog
blue horse
blue cow
blue sheep
yellow dog
yellow horse
yellow cow
yellow sheep
pink dog
pink horse
pink cow
pink sheep
如何在此输出中添加一个'z'变量,使输出看起来像
blue dog 0
blue horse 1
blue cow 2
blue sheep 3
yellow dog 4
...等
答案 0 :(得分:0)
编辑的简单答案就是使用enumerate
:
for z, (x, y) in enumerate(itertools.product(cats1, cats2)):
print x, y, z
blue dog 0
blue horse 1
blue cow 2
blue sheep 3
yellow dog 4
yellow horse 5
yellow cow 6
yellow sheep 7
pink dog 8
pink horse 9
pink cow 10
pink sheep 11
我强烈怀疑您错过了groupby
更简单的解决方案,因此我建议发布一个包含虚拟数据的新问题以及您尝试汇总的详细信息表演。