我在循环中用大数据框创建了子数据帧,我一直在尝试在循环内的子数据框上创建一个列:
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
您是否知道我是否可以在循环中添加该列,而无需为每个数据帧添加数据帧添加列? 提前谢谢!
答案 0 :(得分:0)
最近的问题是'%s' % k
与str(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()
包含所有的全局变量,而不仅仅是您在上面创建的。
例如,它包含Partidas
和k
,可能包含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'