将列添加到for循环中创建的全局变量

时间:2018-05-31 23:16:36

标签: python pandas loops for-loop global

我在循环中用大数据框创建了子数据帧,我一直在尝试在循环内的子数据框上创建一个列:

Partidas=data2['Partida'].unique()
Partida2=[w.replace(' ','_') for w in Partidas]
for i, j in zip(Partidas,Partida2):
    globals()['%s' % j]=data2.loc[data2['Partida']==i]

for k in globals().items()
    ['%s' % k]['Top 10']='a'

因此,我为每个' Partida'创建了一个数据帧。他们的名字是' Partida'他们代表。现在我想在名为' Top 10'的那些数据帧中添加一列,但是我收到以下错误:

TypeError: not all arguments converted during string formatting

您是否知道我是否可以在循环中添加该列,而无需为每个数据帧添加数据帧添加列? 提前谢谢!

1 个答案:

答案 0 :(得分:0)

最近的问题是'%s' % kstr(k)不完全相同,但更慢 - 它是:

  • str(k)相同,但如果k不是一个元组,则会更慢,
  • 如果str(k[0])是单元素元组,则与k相同,或者
  • 如果TypeError是具有任何其他长度的元组,则为k

%运算符采用元组,但为了兼容Python 1.2左右,以及对于交互式终端的快速和脏黑客攻击,它将任何不是元组的东西视为单元素元组。哪个有效,除非你实际上给它一个元组。

如果您不理解为什么k是一个元组 - 那正是dict.items()迭代的:键值元组。

要解决此问题,您可以使用'%s' % (k,)。实际上 str(k)相同,但速度较慢。

但为什么你想要与str(k)相同的东西,但首先要慢一点?为什么不只是str(k)

但是,目前还不清楚你为什么要首先尝试这样做,而它所要做的只是给你另一个TypeError

[str(item)]是一个字符串的列表。 (该字符串恰好是globals()之外的键值元组的字符串表示形式,但这实际上并不重要。)然后,您尝试使用'Top 10'索引该列表,这显然不是是指数。

如果错误不明显,请想象一下你写的这个:

lst = [1, 2, 3]
lst['Top 10'] = 'a'

也许你想要的是:

for k in globals().values():
    k['Top 10'] = 'a'

但这也不会奏效。还有一些问题需要解决,但最终你会遇到一个无法解决的问题。

globals()包含所有的全局变量,而不仅仅是您在上面创建的。

例如,它包含Partidask,可能包含pd。还有一些您导入的其他模块和您定义的功能等等。这些东西中的大部分都不是dicts,dataframes或其他类型的映射,所以你只需要获得另一个TypeError。更糟糕的是,其中一些映射,但不是你想要添加'Top 10'密钥的映射,对于那些,你将默默地破坏你的数据,而不是出错

所有这些只是说明了为什么你不想首先创建一大堆全局变量。如果您只是创建了一个全局字典,并将所有内容存储在其中,这一切都很容易。

这样的事情:

stuff = {}
for i, j in zip(Partidas,Partida2):
    stuff[j] = data2.loc[data2['Partida']==i]
for k in stuff.values():
    k['Top 10'] = 'a'