循环遍历 Python 中的列表并根据项目创建新对象

Looping through a list in Python and creating new objects based on items

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

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

将不胜感激。

谢谢

约翰

实现的方法是:

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

[edit] 查看您的编辑后,我发现您可能想做这样的事情:

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

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

有更好的方法(读作:数据结构)。

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

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]

如果您确定要为元素使用 names,则可以使用 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"])