【问题标题】:dict comprehension for nested lists to filter values of multiple variables嵌套列表的字典理解以过滤多个变量的值
【发布时间】:2015-11-22 12:57:38
【问题描述】:

我在我迭代的列表上有一个 dict 理解的工作示例:这会生成各种指示符(选择),将我的数据行分成案例(顺便说一下,这不是排他的)。

对于上下文:当我将表聚合到某些组时,这样做是为了计算特定行的案例(由列定义的标准)。这些指标现在被收集在单独的数据框中以单独导出,但如果可能的话,我也很乐意将所有指标保存在一个数据框中以进行单个聚合、连接和导出。

现在我想将它嵌套到另一个循环中。这个循环将定义我为值选择/过滤的其他变量。所以第 0 项仍然是条件本身(指标的总和是案例的计数),但第 1 项是TKOST 的选定案例(稍后查看单独标准的选择性总和),第 2 项是另一个变量 I '现在读进去了。

但是这个循环也会影响变量名是有意义的,例如有一个空白的neuro 变量用于计数(或neuro_count),neuro_cost 用于神经病例的TKOST 之和等。这怎么可能?

示例代码基本上来自 Alexander 的answer on another question。文件 I/O 和 pandas 部分用于上下文。

import pandas as pd

items = {'neuro': 'N', 
         'cardio': 'C', 
         'cancer': 'L', 
         'anesthetics': 'N01', 
         'analgesics': 'N02', 
         'antiepileptics': 'N03', 
         'anti-parkinson drugs': 'N04', 
         'psycholeptics': 'N05', 
         'psychoanaleptics': 'N06', 
         'addiction_and_other_neuro': 'N07', 
         'Adrugs': 'A', 
         'Mdrugs': 'M', 
         'Vdrugs': 'V', 
         'all_drugs': ''}

# Create data containers using dictionary comprehension.
dfs = {item: pd.DataFrame() for item in items.keys()}
monthly_summaries = {item: list() for item in items.keys()}

# Perform monthly groupby operations.
for year in xrange(2005, 2013):
    for month in xrange(1, 13):
        if year == 2005 and month < 7:
            continue
        filename = 'PATH/STUB_' + str(year) + '_mon'+ str(month) +'.txt'
        monthly = pd.read_table(filename,usecols=[0,3,32])
        monthly['year'] = year
        monthly['month'] = month
        dfs = {name: monthly[(monthly.ATC.str.startswith('{0}'.format(code))) 
                             & (~(monthly.TKOST.isnull()))]
                     for name, code in items.iteritems()}
        [monthly_summaries[name].append(dfs[name].groupby(['LopNr','year','month']).sum()
                                        .astype(int, copy=False)) 
         for name in items.keys()]

# Now concatenate all of the monthly summaries into separate DataFrames.
dfs = {name: pd.concat([monthly_summaries[name]], ignore_axis=True) 
       for name in items.keys()}

# Now regroup the aggregate monthly summaries.
monthly_summaries = {name: dfs[name].reset_index().groupby(['LopNr','year','month']).sum()
                    for name in items.keys()}

# Finally, save the aggregated results to files.
[monthly_summaries[name].to_csv('PATH/monthly_{0}_costs.csv'.format(name))
 for name in items()]

【问题讨论】:

  • 我不是 100% 清楚你的要求是什么,但我认为你觉得接下来会很棘手,因为你正在使用列表推导来解决副作用(IMO 不是 pythonic) .
  • @AndyHayden 想下一个?
  • ^ 窝! (对不起),很难筑巢。这就是我对您问题的理解?
  • 谢谢,我认为在 dict 中添加另一个 for 会在语法上嵌套循环,这不是一个大问题,是不是(pythonic 与否)。无论哪种方式,我将如何使用外循环来定义变量?使用'{}'?具体如何?为什么内部循环不会搞砸呢?

标签: python select dictionary pandas nested


【解决方案1】:

您应该更喜欢显式的 for 循环:

for name in items.keys():
    monthly_summaries[name].append(dfs[name].groupby(['LopNr','year','month']).sum()
                                            .astype(int, copy=False)

# rather than
[monthly_summaries[name].append(dfs[name].groupby(['LopNr','year','month']).sum()
                                         .astype(int, copy=False)) 
    for name in items.keys()]

后者创建了一个Nones 的虚拟列表(并且可读性较差),因此效率较低。

前者让您轻松嵌套...


但是这个循环也会影响变量名是有意义的,例如为计数(或neuro_count)设置一个空白神经变量,为神经病例的TKOST总和设置一个neuro_cost。这怎么可能?

我通常添加列来进行这些计数,这样它就可以被矢量化/拆分/其他。
(然后不要将这些列写入 csv。)

【讨论】:

  • 我可以拼出循环。如果我想选择另一个变量的值进行求和(而不仅仅是像现在dfs 那样的二进制),外循环会是什么样子?我没有收到您关于添加列和拆分等的最后评论。
  • @László 而不是尝试在一个循环中执行 dfs,您可以执行 groupby 并更新每个值(取决于您想要什么)我不确定我是否得到您想要的,也许该特定部分的示例
  • 更新每个值?该示例试图与以下内容有关。我有一个关于药物代码的专栏。我对药物进行了分类,尽管一种药物也可以分为多个类别。我有药品的购买记录,我想按药品类别汇总每月计数以及成本和剂量总和。这有帮助吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-05
  • 1970-01-01
  • 2021-07-31
  • 2021-02-23
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
相关资源
最近更新 更多