У меня есть список abc и фрейм данных df:
abc = ['foo', 'bar']
df =
A B
0 12 NaN
1 23 NaN
Я хочу вставить список в ячейку 1B, поэтому мне нужен такой результат:
A B
0 12 NaN
1 23 ['foo', 'bar']
Как я могу это сделать?
1) Если я использую это:
df.ix[1,'B'] = abc
Я получаю следующее сообщение об ошибке:
ValueError: Must have equal len keys and value when setting with an iterable
потому что он пытается вставить список (содержащий два элемента) в строку / столбец, но не в ячейку.
2) Если я использую это:
df.ix[1,'B'] = [abc]
затем он вставляет список, в котором есть только один элемент, который является списком abc ( [['foo', 'bar']]
).
3) Если я использую это:
df.ix[1,'B'] = ', '.join(abc)
затем он вставляет строку: ( foo, bar
), но не список.
4) Если я использую это:
df.ix[1,'B'] = [', '.join(abc)]
затем он вставляет список, но имеет только один элемент ( ['foo, bar']
), а не два, как я хочу ( ['foo', 'bar']
).
Спасибо за помощь!
РЕДАКТИРОВАТЬ
Мой новый фреймворк и старый список:
abc = ['foo', 'bar']
df2 =
A B C
0 12 NaN 'bla'
1 23 NaN 'bla bla'
Другой фрейм данных:
df3 =
A B C D
0 12 NaN 'bla' ['item1', 'item2']
1 23 NaN 'bla bla' [11, 12, 13]
Я хочу вставить список abc в df2.loc[1,'B']
и / или df3.loc[1,'B']
.
Если фрейм данных содержит столбцы только с целочисленными значениями и / или значениями NaN и / или значениями списка, тогда вставка списка в ячейку работает отлично. Если в фрейме данных есть столбцы только со строковыми значениями и / или значениями NaN и / или значениями списка, тогда вставка списка в ячейку работает отлично. Но если в фрейме данных есть столбцы с целочисленными и строковыми значениями и другие столбцы, то появляется сообщение об ошибке, если я использую это: df2.loc[1,'B'] = abc
или df3.loc[1,'B'] = abc
.
Другой фрейм данных:
df4 =
A B
0 'bla' NaN
1 'bla bla' NaN
Эти вставки работают отлично: df.loc[1,'B'] = abc
или df4.loc[1,'B'] = abc
.
0.15.0
:df.loc[1,'b'] = ['foo','bar']
Ответы:
Поскольку
set_value
он устарел с версии 0.21.0, теперь вы должны использоватьat
. Он может вставлять список в ячейку, не поднимая a,ValueError
как этоloc
делает. Я думаю, это потому, чтоat
всегда относится к одному значению, аloc
может относиться как к значениям, так и к строкам и столбцам.Вам также необходимо убедиться, что столбец, в который вы вставляете, есть
dtype=object
. Напримеристочник
df = pd.DataFrame(data, dtype=object)
ValueError: setting an array element with a sequence.
; см. ответ @ cs95, если вы получили сообщение об ошибке.df3.set_value(1, 'B', abc)
работает для любого фрейма данных. Позаботьтесь о типе данных столбца «B». Например. список не может быть вставлен в столбец с плавающей запятой, в этом случаеdf['B'] = df['B'].astype(object)
может помочь.источник
Панды> = 0,21
set_value
устарела. Теперь вы можете использоватьDataFrame.at
для установки по метке иDataFrame.iat
для установки по целочисленной позиции.Установка значений ячеек с помощью
at
/iat
Если вы хотите установить значение во второй строке «B» в какой-то новый список, используйте
DataFrane.at
:Вы также можете установить целочисленную позицию, используя
DataFrame.iat
Что если я получу
ValueError: setting an array element with a sequence
?Я попытаюсь воспроизвести это с помощью:
Это из-за того, что ваш объект имеет
float64
тип dtype, а списки -object
s, поэтому есть несоответствие. Что вам нужно сделать в этой ситуации, так это сначала преобразовать столбец в объект.Тогда это работает:
Возможно, но хакерский
Что еще более странно, я обнаружил, что вы можете взломать,
DataFrame.loc
чтобы добиться чего-то подобного, если передаете вложенные списки.Вы можете узнать больше о том, почему это работает здесь.
источник
Как упоминалось в этом посте pandas: как сохранить список в кадре данных? ; dtypes в фрейме данных могут влиять на результаты, а также вызывать фрейм данных или не назначать его.
источник
Быстрая работа
Просто заключите список в новый список, как это сделано для col2 в фрейме данных ниже. Причина, по которой он работает, заключается в том, что python принимает внешний список (списков) и преобразует его в столбец, как если бы он содержал обычные скалярные элементы, которые в нашем случае являются списками, а не обычными скалярами.
источник
Также получаю
ValueError: Must have equal len keys and value when setting with an iterable
,использование .at вместо .loc не имело никакого значения в моем случае, но принудительное использование типа данных столбца dataframe помогло:
Затем я мог бы установить списки, массивы numpy и все остальное как значения отдельных ячеек в моих фреймах данных.
источник