循环遍历Python中的列表并基于项创建新对象

时间:2015-06-03 11:03:35

标签: python list for-loop naming

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

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

非常感谢帮助。

由于

约翰

2 个答案:

答案 0 :(得分:2)

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

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"])

答案 1 :(得分:0)

实现这一目标的方法是:

globals()[d+'_pivot'] = d.pivot_table(...)
看完你的编辑后,我看到你可能想做这样的事情:

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

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

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