【问题标题】:Looping through a list in Python and creating new objects based on items循环遍历 Python 中的列表并根据项目创建新对象
【发布时间】:2015-06-03 11:03:34
【问题描述】:

假设我有一个对象列表(在本例中为数据框)

myList = [dataframe1, dataframe2, dataframe3 ...]

我想遍历我的列表并根据列表项的名称创建新对象。我想要的是每个数据帧的旋转版本,称为“dataframe[X]_pivot”,其中 [X] 是该数据帧的标识符。

我的伪代码类似于:

for d in myList:
    d+'_pivot' = d.pivot_table(index='columnA', values=['columnB'], aggfunc=np.sum)

我想要的输出如下所示:

myList = [dataframe1, dataframe2 ...]
dataframe1_pivoted # contains a pivoted version of dataframe1
dataframe2_pivoted # contains a pivoted version of dataframe2
dataframe3_pivoted # contains a pivoted version of dataframe3

我们将不胜感激。

谢谢

约翰

【问题讨论】:

  • 通常,如果您想要多个相同类型的数据,请将其放在一个列表中。
  • 为什么不pivots = [d.pivot_table(index='columnA', values=['columnB'], aggfunc=np.sum) for d in myList]
  • @PeterWood - 我对你的评论感到困惑;已经有一个涉及的列表
  • @ŁukaszR。不完全是我的想法。我想创建一组旋转数据帧,每个原始数据帧一个。例如dataframe1_pivoted, dataframe2_pivoted Lukasz,您的解决方案会生成一个名为“pivot”的 df
  • 当然可以,但是您为什么要这样做?我在这里闻到了 XY 问题。

标签: python list for-loop naming


【解决方案1】:

你确实想要那样做。动态创建变量几乎总是一个非常糟糕的主意。正确的做法是简单地使用适当的数据结构来保存您的数据,例如列表(因为您的元素都只是编号,您也可以通过索引访问它们)或字典(如果您真的想为每个单独的事物命名):

pivoted_list = []
for df in mylist:
    pivoted_df = #whatever you need to to to turn a dataframe into a pivoted one
    pivoted_list.append(pivoted_df)

#now access your results by index
do_something(pivoted_list[0])
do_something(pivoted_list[1])

同样的事情可以表示为列表推导。假设pivot 是一个函数,它接受一个数据帧并将其转换为一个旋转帧,那么这相当于上面的循环:

pivoted_list = [pivot(df) for df in mylist]

如果您确定要为元素设置名称,您可以使用enumerate 创建一个字典,如下所示:

pivoted_dict = {}
for index, df in enumerate(mylist):
    pivoted_df = #whatever you need to to to turn a dataframe into a pivoted one
    dfname = "dataframe{}_pivoted".format(index + 1)
    pivoted_dict[dfname] = pivoted_df

#access results by name
do_something(pivoted_dict["dataframe1_pivoted"])
do_something(pivoted_dict["dataframe2_pivoted"])

【讨论】:

    【解决方案2】:

    实现的方法是:

    globals()[d+'_pivot'] = d.pivot_table(...)
    

    [edit] 在查看您的编辑后,我发现您可能想要执行以下操作:

    for i, d in enumerate(myList):
        globals()['dataframe%d_pivoted' % i] = d.pivot_table(...)
    

    但是,正如其他人所建议的那样,如果这样做会创建大量全局变量,则不建议这样做。

    有更好的方法(阅读:数据结构)来做到这一点。

    【讨论】:

    • 嗨@mescalinum,对我不起作用。 AttributeError:“str”对象没有属性“view”
    • 否决 - 建议创建全局变量而不是简单地使用适当的数据结构是 IMO 一个非常糟糕的主意。
    • @l4mpi:这是 OP 要求这样做的。我能做的就是阻止这种做法,但既然它是可能的,就在这里。我不支持你的反对票。
    • @mescalinum 如果 OP 头痛并且想询问截肢的最佳方法,你会告诉他们如何做到这一点,或者你宁愿告诉他们为什么他们不应该这样做并推荐其他处理方法?这是一个经典的 XY 问题,OP 之所以问这个问题只是因为他们不知道更好。
    • @l4mpi:我认为 OP 知道更好的方法(即列表)来做到这一点,但故意想要这个 hack。事实上,他使用一个列表作为输入并对其进行迭代,所以他必须至少知道 python 有列表:-)
    猜你喜欢
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    相关资源
    最近更新 更多