【问题标题】:Adding a column to a global variable created in a for loop将列添加到在 for 循环中创建的全局变量
【发布时间】:2018-11-11 01:04:06
【问题描述】:

我在循环中从大数据帧中创建了子数据帧,并且我一直在尝试在循环内的这些子数据帧上创建一列:

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

您知道是否有一种方法可以在循环中添加该列,而不必为每个数据框添加该列的数据框? 提前致谢!

【问题讨论】:

  • 首先,为什么要在这样的循环中创建全局变量?另外,您希望第二个循环做什么?

标签: python pandas loops for-loop global


【解决方案1】:

最接近的问题是'%s' % k 与str(k) 不太一样,但速度较慢——它是:

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

% 运算符接受一个元组,但为了与 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() 包含所有您的全局变量,而不仅仅是您在上面创建的那些。

例如,它包含Partidas、k,可能还有pd。还有一堆你导入的其他模块和你定义的函数等等。大多数这些东西不是字典、数据帧或其他类型的映射,所以你只会得到另一个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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 2021-11-11
    相关资源
    最近更新 更多