Добавление столбца в глобальную переменную, созданную в цикле for - PullRequest
0 голосов
/ 01 июня 2018

Я создал подкадры из большого кадра данных в цикле, и я пытался создать столбец на этих подкадрах внутри цикла:

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'

Поэтому я создаю один кадр данных для каждого 'Партида »и их имя - это название« Партиды », которую они представляют.Теперь я хочу добавить столбец к этим фреймам данных с именем «Топ-10», но я получаю следующую ошибку:

TypeError: not all arguments converted during string formatting

Знаете ли вы, есть ли способ добавить этот столбец в цикл, не имеяперейти на каждый кадр данных, добавив столбец?Заранее спасибо!

1 Ответ

0 голосов
/ 01 июня 2018

Непосредственная проблема в том, что '%s' % k - это не то же самое, что str(k), но медленнее - это:

  • То же, что и str(k), но медленнее, если k - это что-тоно кортеж,
  • То же самое, что и str(k[0]), если k - это одноэлементный кортеж, или
  • A TypeError, если k - это кортеж любой другой длины..

Оператор % принимает кортеж, но для совместимости с Python Ancient 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'
...