【问题标题】:using Python list to set conditional pandas statement使用 Python 列表设置条件 pandas 语句
【发布时间】:2016-08-09 15:09:18
【问题描述】:

我有一个需要聚合的计算,但它不适用于 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”循环中,第 2 行中的“df”都会被覆盖。这是正确的想法吗?

编辑........ 这是一种更简单的查看方式。 我想从 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

...等

【问题讨论】:

  • 何不试试看?
  • 我相信如果你发布一个示例数据集并显示你想要的输出,我们可以建议一个更好的方法。

标签: python python-2.7 pandas


【解决方案1】:

编辑的简单答案是使用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 的更简单的解决方案,因此我建议您发布一个新问题,其中包含虚拟数据和您尝试执行的聚合的详细信息。

【讨论】:

  • 同意。我尽可能使用 groupby。然而,由于错误,我正在使用的模块中的算法无法与 groupby 一起使用。
猜你喜欢
  • 2021-08-27
  • 2022-01-14
  • 2012-05-22
  • 2018-09-26
  • 1970-01-01
  • 2017-02-03
  • 1970-01-01
  • 2019-06-02
  • 1970-01-01
相关资源
最近更新 更多