Ответ 1
df3.set_value(1, 'B', abc)
работает для любого фрейма данных. Позаботьтесь о типе данных столбца "B". Например. список не может быть вставлен в столбец с плавающей точкой, в этом случае df['B'] = df['B'].astype(object)
может помочь.
У меня есть список 'abc' и dataframe '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']
.
Если в dataframe есть столбцы только с целыми значениями и/или значениями NaN и/или значениями списка, тогда вставка списка в ячейку работает отлично. Если в dataframe есть столбцы только со строковыми значениями и/или значениями NaN и/или значениями списка, тогда вставка списка в ячейку работает отлично. Но если в dataframe есть столбцы с целыми и строковыми значениями и другими столбцами, тогда появляется сообщение об ошибке, если я использую это: 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
.
df3.set_value(1, 'B', abc)
работает для любого фрейма данных. Позаботьтесь о типе данных столбца "B". Например. список не может быть вставлен в столбец с плавающей точкой, в этом случае df['B'] = df['B'].astype(object)
может помочь.
Поскольку set_value
устарело с версии 0.21.0, теперь вы должны использовать at
. Он может вставить список в ячейку без ValueError
как это делает loc
. Я думаю, это потому, что at
всегда ссылается на одно значение, а loc
может ссылаться на значения, а также на строки и столбцы.
df = pd.DataFrame(data={'A': [1, 2, 3], 'B': ['x', 'y', 'z']})
df.at[1, 'B'] = ['m', 'n']
df =
A B
0 1 x
1 2 [m, n]
2 3 z
v0. 23+, set_value
устарела.
Теперь вы можете использовать DataFrame.at
для установки по метке, а DataFrame.iat
для установки по целочисленной позиции.
at
/ iat
# Setup
df = pd.DataFrame({'A': [12, 23], 'B': [['a', 'b'], ['c', 'd']]})
df
A B
0 12 [a, b]
1 23 [c, d]
df.dtypes
A int64
B object
dtype: object
Если вы хотите установить значение во второй строке "B" для нового списка, используйте DataFrane.at
:
df.at[1, 'B'] = ['m', 'n']
df
A B
0 12 [a, b]
1 23 [m, n]
Вы также можете установить целочисленную позицию, используя DataFrame.iat
df.iat[1, df.columns.get_loc('B')] = ['m', 'n']
df
A B
0 12 [a, b]
1 23 [m, n]
ValueError: setting an array element with a sequence
?Я постараюсь воспроизвести это с:
df
A B
0 12 NaN
1 23 NaN
df.dtypes
A int64
B float64
dtype: object
df.at[1, 'B'] = ['m', 'n']
# ValueError: setting an array element with a sequence.
Это связано с тем, что ваш объект имеет тип float64
d, тогда как списки являются object
s, так что здесь есть несоответствие. В этой ситуации вам нужно сначала преобразовать столбец в объект.
df['B'] = df['B'].astype(object)
df.dtypes
A int64
B object
dtype: object
Тогда это работает:
df.at[1, 'B'] = ['m', 'n']
df
A B
0 12 NaN
1 23 [m, n]
Еще более странно, я обнаружил, что вы можете взломать DataFrame.loc
для достижения чего-то похожего, если вы пропустите вложенные списки.
df.loc[1, 'B'] = [['m'], ['n'], ['o'], ['p']]
df
A B
0 12 [a, b]
1 23 [m, n, o, p]
Вы можете прочитать больше о том, почему это работает здесь.
Как упоминалось в этом сообщении pandas: как сохранить список в фрейме данных?; dtypes в кадре данных могут влиять на результаты, а также называть фрейм данных или не назначаться.
Быстрая работа вокруг
Просто заключите список в новый список, как это было сделано для col2 во фрейме данных ниже. Причина, по которой он работает, заключается в том, что python берет внешний список (списков) и преобразует его в столбец, как если бы он содержал обычные скалярные элементы, которые в нашем случае являются списками, а не обычными скалярами.
mydict={'col1':[1,2,3],'col2':[[1, 4], [2, 5], [3, 6]]}
data=pd.DataFrame(mydict)
data
col1 col2
0 1 [1, 4]
1 2 [2, 5]
2 3 [3, 6]